快速排序前置

这篇博客探讨了两种快速排序的变形方法。第一种方法将数组中所有小于目标值的元素移动到左侧,大于目标值的元素移动到右侧,空间复杂度为O(1),时间复杂度为O(N)。第二种方法进一步改进,处理了等于目标值的元素,将其放在中间,同样保持了空间和时间复杂度。这两种方法都通过指针操作实现了原地排序,避免了额外的空间消耗。
摘要由CSDN通过智能技术生成

快排前置

问题1: 给定一个数组,让小于target的放置在数组左侧,大于target的放置在数组右侧,要求空间复杂度为O(1),时间复杂度为O(N)

public class PreQuickSort{
   /**
     * 给定一个数组,让小于target的放置在数组左侧,大于等于target放置在数组右侧
     *
     * @param arr
     * @param target 定义两个指针
     *               point1 -> 永远指向比target小于或等于的数的最右侧
     *               point2 -> 用于遍历 arr
     */
    public static void preQuickSort1(int[] arr, int target) {
        int point1 = -1;
        int point2 = 0;
        while (point2 < arr.length) {
            if (arr[point2] <= target) {
                swap(arr, ++point1, point2++);
            } else {
                ++point2;
            }
        }
    }
     /**
     * 相比上面一个方法,省略了一个无效的交换动作(即自己跟自己交换)
     *
     * @param arr
     * @param target 定义两个指针
     *               point1 -> 永远指向比target小的数的最右侧
     *               point2 -> 用于遍历 arr
     */
    public static void preQuickSort12(int[] arr, int target) {
        int point1 = -1;
        int point2 = 0;
        while (point2 < arr.length) {
            if (arr[point2] <= target && (point1 + 1) == point2) {
                point1++;
                point2++;
            } else if (arr[point2] <= target) {
                swap(arr, ++point1, point2++);
            } else {
                ++point2;
            }
        }
    }

}

问题2: 给定一个数组,让<target的数在左侧,大于target在右侧,等于target的在中间。该问题又称之为荷兰国旗问题。要求空间复杂度O(1),时间复杂度O(N);

public class PreQuickSort{
   /**
     * 给定一个数组,让<target在左侧,大于target在右侧,等于target在中间
     *
     * @param arr
     * @param target
     */
    public static void preQuickSort2(int[] arr, int target) {
        int l = -1;
        int r = arr.length;
        int point = 0;
        while (point < r) {
            if (arr[point] < target) {
                swap(arr, ++l, point++);
            } else if (arr[point] == target) {
                point++;
            } else {
                swap(arr, --r, point);
            }
        }
    }

  /**
     * 给定一个数组,让<target在左侧,大于target在右侧,等于target在中间
     *
     * @param arr
     * @param target
     */
    public static void preQuickSort21(int[] arr, int target) {
        int left = -1;
        int right = arr.length;
        int point = 0;
        while (point < right) {
            if (arr[point] < target && (point == left + 1)) {
                left++;
                point++;
            } else if (arr[point] == target) {
                point++;
            } else if (arr[point] > target) {
                swap(arr, point, --right);
            } else {
                swap(arr, point, ++left);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值