一、基本的快速排序

在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组快速排序,直到数组排序完成。

快速排序 java实现 (原理-优化) 三路快排

 代码实现:

    public void quickSorted ( int arr[] ) {

        int n = arr.length - 1;            // 闭区间 [0...n]
        __quickSorted (arr, 0, n);
    }

    private __quickSorted( int arr[], int L, int R) {

        if ( (L >= R) {
            return;
        }

        // 将基点移动到最终位置的方法
        int p = __partioner(arr, L, R);

        // 递归拆分数组
        __quickSorted(arr, L, p - 1);
        __quickSorted(arr, p + 1, R);
    }

 

那么最大的问题就是怎么把这个基点移动到它最终应该所在的位置。

快速排序 java实现 (原理-优化) 三路快排

代码实现:

    private int __partioner ( int arr[], int L, int R ) {

        int v = arr[L];

        // [L + 1, j] < v ; [j + 1, i) > v;
        int j = L;

        for ( int i = L + 1; i <= R; i++ ) {
            if ( arr[i] < v) {
                // 交换 arr[i] 和 arr [j + 1]
                int tmp = arr[j + 1];
                arr[j + 1] = arr[i];
                arr[i] = tmp;
                j++;
            }
        }
        // 交换 arr[j]  和arr[L]
        int tmp = arr[j];
        arr[j] = arr[L];
        arr[L] = tmp;

        return j;
    }

 

最终实现:

    public void quickSorted ( int arr[] ) {

        int n = arr.length - 1;            // 闭区间 [0...n]
        __quickSorted (arr, 0, n);
    }

    private __quickSorted( int arr[], int L, int R) {

        if ( (L >= R) {
            return;
        }

        // 将基点移动到最终位置的方法
        int p = __partioner(arr, L, R);

        // 递归拆分数组
        __quickSorted(arr, L, p - 1);
        __quickSorted(arr, p + 1, R);
    }

    private int __partioner ( int arr[], int L, int R ) {

        int v = arr[L];

        // [L + 1, j] < v ; [j + 1, i) > v;
        int j = L;

        for ( int i = L + 1; i <= R; i++ ) {
            if ( arr[i] < v) {
                // 交换 arr[i] 和 arr [j + 1]
                int tmp = arr[j + 1];
                arr[j + 1] = arr[i];
                arr[i] = tmp;
                j++;
            }
        }
        // 交换 arr[j]  和arr[L]
        int tmp = arr[j];
        arr[j] = arr[L];
        arr[L] = tmp;

        return j;
    }
View Code 快速排序完整代码

相关文章:

  • 2021-06-10
  • 2022-12-23
  • 2022-12-23
  • 2021-10-29
  • 2022-03-07
  • 2021-04-07
  • 2021-05-20
猜你喜欢
  • 2021-04-12
  • 2022-01-13
  • 2021-05-31
  • 2021-06-02
  • 2022-12-23
  • 2021-12-09
相关资源
相似解决方案