无聊时总结总结算法之05快速排序

9 篇文章 0 订阅
1 篇文章 0 订阅

快速排序

基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
快速排序的示例:
(a)一趟排序的过程:
这里写图片描述
(b)排序的全过程:
这里写图片描述
2、算法复杂度
最好的情况下:因为每次都将序列分为两个部分(一般二分都复杂度都和logN相关),故为 O(N*logN)
最坏的情况下:基本有序时,退化为冒泡排序,几乎要比较N*N次,故为O(N*N)
3、稳定性
由于每次都需要和中轴元素交换,因此原来的顺序就可能被打乱。如序列为 5 3 3 4 3 8 9 10 11会将3的顺序打乱。所以说,快速排序是不稳定的!

void QuickSort(int* a , int low, int high)
{
    if(low<high)
    {
        int temp = a[low]; //找到基准元素 (挖一个坑)
        int i=low;
        int j=high;
        while(i < j)
        {
            while(i<j && a[j]>=temp)  //<----- 冒似找大实际找小
                j--;
            if(i<j) a[i++]=a[j];       //i++ 不是 ++i
            while(i<j && a[i]<temp)   //-----> 冒似找小实际找大
                i++;
            if(i<j) a[j--]=a[i];

        }
        a[i]=temp;
        QuickSort(a , low, i-1);
        QuickSort(a , i+1, high);
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值