快排(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],同上

<iframe src="https://tool.lu/coderunner/embed/721.html" width="650" height="550" frameborder="0" mozallowfullscreen webkitallowfullscreen allowfullscreen></iframe>

猜你喜欢

转载自www.cnblogs.com/pacino12134/p/11294474.html