快速排序(Java实现)

 

  1. 选出一个 key,一般是最左边或是最右边的指。

  2. 定义一个 L 指向最左边的位置,定义一个 R 指向最右边的位置,L 从左向右走,R 从右向左走。(需要注意的是:若选择最左边的数据作为 key,则需要 R 先走;若选择最右边的数据作为 key,则需要 L 先走)。

  3. 我们以选取最左边的值作为 key 为例子,那么 R 先走,在走的过程中,若 R 遇到小于 key 的数,则停下,L 开始走,直到 L 遇到一个大于 key 的数时,将 L 和 R 的内容交换,R 再次开始走,如此进行下去,直到 L 和 R 最终相遇,此时将相遇点的内容与 key 交换即可。

  4. 经过一次单趟排序,最终使得 key 左边的数据全部都小于 key,key 右边的数据全部都大于 key。

这个方法的精华在于:单趟排完以后,key 已经放在正确的位置,那么左边有序,右边有序,那么我们整体就有序了

动画演示

快速排序动图演示

代码演示

public static void main(String[] args) {
        int[] arr = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    // 在main方法中直接编写
        for (int i = 0; i < arr.length/2; i++) {
            int key = i;
            int left = 0;
            int right = arr.length-1;
            while (left < right) {

                //右边找比key小的值
                while (left < right && arr[right] >= arr[key]) {
                    right--;
                }
                //左边找比key大的值
                while (arr[left] <= arr[key] && left<right) {
                    left++;
                }
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
            int tem = arr[left];
            arr[left] = arr[key];
            arr[key] = tem;

        }
        System.out.println(Arrays.toString(arr));
    }
// 通过方法递归调用实现快速排序
​
public static void sort(int[] arr,int start,int end){
        if (start >= end){
            return;
        }
        int left = start;
        int right = end;
        int key = arr[left];
        while (left<right)
        {
            while (left<right && arr[right]<key){
                right--;
            }
            while (left<right && arr[left]>key){
                left++;
            }
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
        key = arr[left];
        arr[left] = key;
​
        sort(arr, start,left-1);
        sort(arr, left+1, end);
​
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值