快速排序,只上代码,注释全在代码间

本文详细介绍了快速排序算法的原理及其实现过程。通过选取基准值,利用双指针技巧进行数据交换,确保左右两侧数据有序。在排序过程中,特别处理了基准值相等的情况,保证了排序的正确性。最后,通过递归完成整个数组的排序。
摘要由CSDN通过智能技术生成

快速排序

public static void main(String[] args) {
     int[] arr = {8,7,6,2,5,8,2,4,7,6,8};
     kuaisu(arr,0,arr.length-1);
 }

 public static void kuaisu(int[] arr,int left,int right){
     int l = left;
     int r = right;
     int pivot = arr[(left+right)/2];//得出基准值大小的数据下标(该下标不应顶一直为基准值的数值大小)
     int temp=0;

     while (l<r){

         //左哨兵(l)右移,知道发现小于基准值的数据或遇见右哨兵
         while (arr[l]<pivot){
             l++;
         }
         //右哨兵(r)右移,知道发现小于基准值的数据或遇见左哨兵
         while (arr[r]>pivot){
             r--;
         }
         //退出循环,进入递归
         if(l>=r){
             break;
         }

         //数据交换
         temp=arr[l];
         arr[l] = arr[r];
         arr[r]=temp;


         //先右边--,后左边++,使得存在左右两边都是基准值时,只移动右边的值,因为,要保证r,l相交的地方的右边一定要>=基准值,
         //保证了左边的数据(等于基准值的值)在遇到右边需交换的数据后一定会交换,使得r,l相交下标左边的值一定小于基准值,

         // 特殊一点:(左边的值无法交换的情只有与之交换的值一直时基准值,这种情况下,左边的值的右方也全部时大于或等于基准值的数据),
         // 这种特殊情况,包括左边l一直是基准值,或跳过基准值。但是无论如何rl交点处右边一定大于基准值,左边可以通过下一次递归排序
         if(arr[l] == pivot){
             System.out.println("l"+arr[l]);
             r-=1;
         }
         if (arr[r] == pivot){
             System.out.println(arr[r]);
             l++;
         }


     }

     //保证不会出现下标越界,ps:我现在不知道什么情况下会出现下标越界
     if(l==r){
         l++;
         r--;
     }

     //从1和r相遇的地方开始,l左边左递归,r右边有递归
     if (left<r) {           //判断语句,使得递归存在结束条件(递归至最左)
         kuaisu(arr,left,r);
     }
     if (right>l) {
         kuaisu(arr,l,right);
     }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值