快速排序---简解

快速排序是真的块。

简单的说一下快排的思想:

第一步,找出一个键值,通常取第一个元素,用temp中间变量暂存,left和right为排序范围的左边界和右边界。

第二步、从右边找出比temp小的放入i下标的位置。i++。

第三步、从i+1的位置往后找到比temp大的值放入j下标处。

第四步、知道i >=j..

第一次排序做好了,然后重复步骤。。排序left到j - 1,i+1 到right。

 

void quickSort(int a[],int left,int right)
{
    int i = left;
    int j = right;
    int temp = a[left];
    
    if(i >= j )  //说明不需要排序了
        return;

    while(i != j)
    {
        while(i < j && a[j] >= temp)//寻找比temp小的值
            j--;
        if(i < j)
            a[i] = a[j];//把小的值放入
        while(i < j && a[i] <= temp)//寻找比temp大的值
            i++;
        if(i < j)
            a[j] = a[i];
    }
        a[i] = temp;
        quickSort(a,left,j-1);
        quickSort(a,i+1,rigth);
}

 快速排序具有最好的平均性能(average behavior),但最坏性能(worst case behavior)和插入排序相同,也是O(n^2)。比如一个序列5,4,3,2,1,要排为1,2,3,4,5。按照快速排序方法,每次只会有一个数据进入正确顺序,不能把数据分成大小相当的两份,很明显,排序的过程就成了一个歪脖子树,树的深度为n,那时间复杂度就成了O(n^2)。尽管如此,需要排序的情况几乎都是乱序的,自然性能就保证了。据书上的测试图来看,在数据量小于20的时候,插入排序具有最好的性能。当大于20时,快速排序具有最好的性能,归并(merge sort)和堆排序(heap sort)也望尘莫及,尽管复杂度都为nlog2(n)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值