算法-排序-02-快速排序

2, 快速排序(平分移动+迭代排序)-冒泡算法的优化

  • 双指针(左右指针)进行中间切分交换
  • 然后使用分治思想再分别对各自的切分区域再进行相同的交换操作

快速排序思路
首先以中间一个数字为基准,把该数右侧大于该数的移至该数左侧,把该数左侧大于数的移至该数右侧。这样大于该数的数字都在右侧,小于该数的都在该数左侧。
接着再使用迭代算法, 依次对左侧的进行相同方法的移动。
接着再使用迭代算法, 依次对右侧的进行相同方法的移动。
当迭代结束,该数组数字即是有序

package im.bool.a06_sort_algrithm;

import java.util.Arrays;

/**
 * @author : 不二
 * @date : 2022/4/4-下午3:51
 * @desc : 快速排序:
 *          双指针(左右指针)进行中间切分交换,
 *          然后使用分治思想再分别对各自的切分区域再进行相同的交换操作
 *
 * 快速排序思路
 * 首先以中间一个数字为基准,把该数右侧大于该数的移至该数左侧,把该数左侧大于数的移至该数右侧。这样大于该数的数字都在右侧,小于该数的都在该数左侧。
 * 接着再使用迭代算法, 依次对左侧的进行相同方法的移动。
 * 接着再使用迭代算法, 依次对右侧的进行相同方法的移动。
 * 当迭代结束,该数组数字即是有序
 *
 **/
public class a06_09_Quick_v3 {

    public static void main(String[] args) {
        // int[] arr = {6, 7, 8, 4, 3, 2, 1};
        int[] arr = {9, -2, -1, 3, 10, 100, -3, 3, 4, 20};
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static int[] quickSort(int[] arr, int left, int right) {

        if(left < right) {
            int midIndex = (left + right) / 2;
            int midValue = arr[midIndex];

            int leftPointer = left;
            int rightPointer = right;

            while (leftPointer < rightPointer) {

                // 如果是小于,那就把指针往后移动
                // 和中间值相同的数据也需要进行交换
                while (arr[leftPointer] < midValue) {
                    leftPointer++;
                }
                while (arr[rightPointer] > midValue) {
                    rightPointer--;
                }

                // 如果走到这里,说明:做指针找到了一个值,右指针找到了一个值
                // 如果左指针和右指针 不是 都指向 midIndex,那么就需要交换
                int tmp = arr[leftPointer];
                arr[leftPointer] = arr[rightPointer];
                arr[rightPointer] = tmp;

                // 因为和中间值相同的数据,所以如果左右两个指针的数据和中间值相同,那么必须得有一个指针跳出来
                if (arr[leftPointer] == midValue && arr[rightPointer] == midValue) {
                    leftPointer++;
                }
            }

            // 这个时候leftPointer == rightPointer
            // 而且需要作为新的中间值进行迭代调用
            quickSort(arr, left, rightPointer - 1);
            quickSort(arr, leftPointer, right);
        }
        return arr;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值