为了找个好工作,从码农到工程师,所以来记录下算法系列自己的理解吧。
快速排序,属于交换类排序的一种,从算法设计来讲是分治法思想的一种体现。但是相比于原始的冒泡排序,还是做了一些优化的。
对于快速排序,首先的理解是有一个枢轴点(中点),在这个中点元素的左边都是比其小的元素,在这个中点元素的右边都是比其大的元素。这是核心思想。
怎么实现呢?
首先我们想就取第一个元素作为“中点”元素。
然后是左右遍历。
再想有三个while。
注意这里遍历的时候有一些代码方面的小技巧。
取迭代器i与j,
while i<j
我们先找比其大的,从右边开始遍历,一旦找到一个小的元素(比“中点”小)就停下来记录其位置为j。
再从左边开始遍历,这里条件可以用<=,只要是比中点小的就继续往前面走,直到找到一个大的元素(比“中点”大)就停下来其位置为i。
这里我们交换i与j相应的元素。
再继续while循环
这样一趟循环下来,就可以完成一个轮次,即中点左边的小右边的大,并且知道这个中点位置是i。
再用两个递归函数。
quickSort(a,n,L,i-1);
quickSort(a,n,i+1,R);
即可完成分治法的思想。
代码如下,
// 快速排序,分治法
void quickSort(int a[],int n,int L,int R)
{
if(L<R)
{
int i=L,j=R;
int temp = a[L];
while(i<j)
{
while(a[j]>temp&&i<j)
{
--j;
}
while(a[i]<=temp&&i<j)
{
++i;
}
swap(a[i],a[j]);
}
swap(a[i],a[L]);
quickSort(a,n,L,i-1);
quickSort(a,n,i+1,R);
}
}