算法之快排 Quick Sort

首先要说明的是快速排序是递归算法的一种,因此对于内存紧张的机器来说它并非是个好的选择。

而且快速排序是大规模递归的算法,因此它比大部分排序算法都要快一般用于数据个数比较多的情况。尽管可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。

快速排序是C.R.A.Hoare于1962年发明的一种划分交换排序,由于采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

分治法的流程是:
1. 从数列中取出一个数作为基准数。
2. 排序过程中,把比基准数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3. 再对左右区间重复第二步,直到各区间只有一个数。

看起好像很简单,嗯,写起来也很简单。

void quicksort(int arr[],int left,int right){
    if(left<right){
        int idx=left, sec=right, tmp=arr[left];
        while(idx<sec){
            while(arr[sec]>=tmp)
                sec--;
            if(idx<sec)
                arr[idx++]=arr[sec];
            while(idx<sec && arr[idx]<tmp)
                idx++;
            if(idx<sec)
                arr[sec--]=arr[idx];
        }
        arr[idx] = tmp;
        quicksort(arr,left,idx-1);
        quicksort(arr,idx+1,right);
    }
}

可以看出来最坏的情况就是元素接近有序的情况下,其时间复杂度会达到平方阶:

O(n^2)