快排

快速排序

介绍 时间复杂度O(nlogn) 不稳定 基于比较

代码实现

递归版

一个分治的递归主函数,一个实现partition的函数,这里给出patition函数实现的三种方式。

    // 主函数
    public void quickSort(int[] nums, int left, int right) {
        if (left >= right) {
            return;
        }
        // p的索引为nums[0]排好序的位置,以此为分界点将问题分解为求左右两个子数组的排序
        int p = partition1(nums,left,right);
        // int p = partition2(nums,left,right);
        // int p = partition3(nums,left,right);
        quickSort(nums, left,p-1);
        quickSort(nums, p+1, right);
    }
    // 实现patition
    // 3种方式

    // 双指针 交换
    public int partition1(int[] nums, int left, int right) {
        int p = nums[left];
        int l = left;
        int r = right;
        while (l < r) {
            while (l < r && nums[r] > p) {
                r--;
            }
            while (l < r && nums[l] <= p) {
                l++;
            }
            if (l < r) {
                int t = nums[r];
                nums[r] = nums[l];
                nums[l] = t;
            }
        }
        nums[left] = nums[r];
        nums[r] = p;
        return r;
    }
    // 双指针 填坑
    private int partition2(int[] nums, int left, int right) {
        int p = nums[left];
        int l = left;
        int r = right;
        while(l < r) {
            while(l < r && nums[r] > p) {
                r--;
            }
            if (l < r) {
                nums[l] = nums[r];
                l++;
            }
            while(l < r && nums[l] <= p) {
                l++;
            }
            if (l < r) {
                nums[r] = nums[l];
                r--;
            }
        }
        nums[r] = p;
        return r;
    }
    
    // 单指针 整理
    private int partition3(int[] nums, int left, int right) {
        int p = nums[left];
        int mark = left;

        for(int i=left+1;i<=right;i++) {
            if (nums[i] < p) {
                mark++;
                int t = nums[mark];
                nums[mark] = nums[i];
                nums[i] = t;
            }
        }
        nums[left] = nums[mark];
        nums[mark] = p;
        return mark;
    }
posted @ 2022-09-25 20:00  北de窗  阅读(4)  评论(0编辑  收藏  举报