快速排序两种思路

这个排序我还是不理解,先把它记录下来,对于递归的思想我的觉悟还不够呀。

package QuickSort;

import java.util.Arrays;

public class QuickSort {

    public static void main(String[] args) {
        int arr[]={-9,78,0,23,-567,70};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));

    }
    public static  void quickSort(int arr[],int left,int right){
        int l=left;
        int r=right;
        int temp=0;
        int pivot=arr[(l+r)/2];

        while(l<r){ // 只要左边的索引小于右边的索引 就一直循环
            while(arr[l]<pivot){
                l+=1;
            }
            while(arr[r]>pivot){
                r-=1;
            }

            if (l>=r){
                break;
            }

            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;

            // 如果交换完后,发现左边的arr[l]=pivot , 就让r--后移
            if (arr[l]==pivot){
                r-=1;
            }
            if (arr[r]==pivot){
                l+=1;
            }

        }
        // 防止 栈溢出
        if(l==r){
            l+=1;
            r-=1;
        }
        // 分割左边,知道为1  保证左右两边为有序的

        if (left<r){
            quickSort(arr, left, r);
        }
        if (right>l){
            quickSort(arr, l, right);
        }

    }
}


    static  void sort(int []arr,int begin,int end){
        if (begin>end){
            return;
        }
        int left=begin; //左指针
        int right=end; // 右指针
        // 基准数总是指向第一个数
        int temp=0;
        while (left!=right){
            // 先让左边的指针先移动,因为左指针指向的值是初始的基准数值
            while (left<right&&arr[right]>arr[begin]){
                right--;
            }
            while (left<right&&arr[left]<=arr[begin]){
                left++;
            }
            // 当出来的时候,代表两个值需要互换
           if (left<right){
               temp=arr[left];
               arr[left]=arr[right];
               arr[right]=temp;
           }
        }
        // 此时出来代表已经处理完了第一轮的基准数分割
        // 还需要将基准数的位置进行放置
        temp=arr[begin];
        arr[begin]=arr[left];
        arr[left]=temp;

        sort(arr,left+1,end);
        sort(arr,begin ,left-1);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值