码迷,mamicode.com
首页 > 编程语言 > 详细

快排(c++)

时间:2019-08-03 14:31:27      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:quic   第一个   有关   return   深度   class   span   index   i++   

时间复杂度最坏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++)

标签:quic   第一个   有关   return   深度   class   span   index   i++   

原文地址:https://www.cnblogs.com/pacino12134/p/11294474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!