快速排序算法

快排的作用:

从i 到 j 这段内每次经过一次快排就能 让首元素找到合适的位置ki<=k<=j),于是就分成了(到 k-1)和(k+1到j)两端 没有排序好

例题

有如下数组

27990813648616710882590
 i          j

 

 

 

取出首元素(第一个元素)以及两个指针 i j,分别指向99 和 90 

找 比首元素27大 的元素(比首元素小则 i 往后移动 ),找 比首元素27小 的元素(比首元素大则 j 往前移动),

如果满足了 ij 的条件则 将元素 调换位置,然后继续找,直至i>=j为止,此时 i 的位置就是首元素合适的位置

99比27大,满足条件 ,i 不变位置;比较 j 位置 90 发现比27大,不满足条件,则 j 往前移动,发现 25 满足条件;

将99和25(此时i ,j 指向的元素)对调位置,变成如下

27250813648616710889990
 i         j 

  

 

 

 

同样的步骤,执行依次会有如下的结果

 

27250813648616710889990
     i   j   

 

 

 

对换位置:

27250813108616764889990
     i   j   

 

 

 


27250813108616764889990
      i j    

 

 

 

对换位置:

27250813107168664889990
      i j    

 

 

 


 

27250813107168664889990
       i=j     

 

 

 

满足i>=j对换i和首元素的位置

16250813107278664889990
       i=j     

 

 

 

此时会发现  27左边的元素都比27小,右边的比27大


分成两段于是重复执行上面的步骤就可以得到排序好的数组

算法:递归伪代码,swap交换元素位置的 函数需要自己实现

quickSort(ArrayList  arr,int i,int j,int k,int m){//k是首元素的下标,m是末尾元素下标
    if(i>=j){
        swap(arr[k],arr[i]);//对调首元素和i的位置、i位置就是首元素排序好后的位置
        quickSort(arr, k, i-1, k, i-1);//快排i前面的,k(首元素位置没变) 到i-1(新的末尾元素位置)
        quickSort(arr, i+1, m, i+1, m);//快排i后面的 i+1(新的首元素位置) 到 m(末尾元素m没有变)
        return;
    }
    
    if(arr[i] > arr[k] && arr[j] < arr[k]){
        swap(arr[i],arr[j]);      //1、两条件都满足 交换i,j元素位置
        return;
    }else if(arr[i] > arr[k] && arr[j] > arr[k]){
        quickSort(arr,i,j-1,k,m);   //2、j不满足往前移动
    }else if(arr[i] < arr[k] && arr[j] < arr[k]){
        quickSort(arr,i+1,j,k,m);   //3、i不满足往后移动
    }else{                        //都不满足则都移动
        quickSort(arr,i+1,j-1,k,m); //4、 i,j都对应移动
        return;
    }
}

 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗水人间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值