[算法]快速排序

为了找个好工作,从码农到工程师,所以来记录下算法系列自己的理解吧。

快速排序,属于交换类排序的一种,从算法设计来讲是分治法思想的一种体现。但是相比于原始的冒泡排序,还是做了一些优化的。
对于快速排序,首先的理解是有一个枢轴点(中点),在这个中点元素的左边都是比其小的元素,在这个中点元素的右边都是比其大的元素。这是核心思想。

怎么实现呢?
首先我们想就取第一个元素作为“中点”元素。
然后是左右遍历。
再想有三个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);
    }
}
posted @ 2020-04-18 18:44  likeshu  阅读(94)  评论(0编辑  收藏  举报