快排(c++)

Posted pacino12134

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快排(c++)相关的知识,希望对你有一定的参考价值。

时间复杂度最坏n2,平均nlogn

解释:遍历一次O(n),快排采用分治法来遍历,看成二叉树,那么遍历的次数跟他的深度有关系,n个节点,那么深度至少是log(n+1),所以平均nlogn;二叉树最大深度那就是N了,所以最坏时间复杂度n2

//找基准数,并放到中间
//此函数执行一次,就找到了一个基准数并且就放在了正确位置
int mid_index(arr[],left,right)
    int i=left+1;
    int j=right;
    int temp=arr[i];
    while(i<=j)
        while(arr[i]<temp) i++;
        while(arr[j]>temp) j--;
        if(i<j) swap(arr[i],arr[j]);
    
    //到了边界了
    swap(arr[j],arr[left]);
    return j;



void quick_sort(arr[],left,right)
    //保证长度至少为2
    if(left>=right) return;
    int mid=mid_index(arr,left,right);
    quick_sort(arr,left,mid-1);
    quick_sort(arr,mid+1,right);

边界问题分析(第一个while循环条件i<=j):

当i=j时,正好arr中心处,此时arr[i]==arr[j]:

  • 若该值小于temp,i++后i到了第一个大于temp的数,j不变,此时交换arr[j]和arr[left],j左边的值就都小于基准值,右边都大于基准值,也就是说这个基准值到了正确的位置了
  • 若arr[i]==arr[j] > temp,i不判断,j--之后到了最后一个小于基准值的数,此时i>j,交换arr[j]和arr[left],同上

 

以上是关于快排(c++)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 快排-随机中轴

C++ 快排-随机中轴

看看C++快排(sort)源码

linux c++ 快排,堆排序,插入排序时延对比

linux c++ 快排,堆排序,插入排序时延对比

C++ 快排递归实现和非递归实现