欢迎访问宙启技术站
智能推送

10个Java函数,实现快速排序算法

发布时间:2023-06-04 09:51:23

快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

下面介绍10个Java函数,实现快速排序算法。

1. 使用递归方式实现快速排序

public void quickSort(int[] arr, int left, int right) {
    if (left >= right) return; // 如果左指针大于等于右指针,直接返回
    int i = left, j = right, pivot = arr[left];
    while (i < j) {
        while (i < j && arr[j] >= pivot) j--;
        if (i < j) arr[i++] = arr[j];
        while (i < j && arr[i] < pivot) i++;
        if (i < j) arr[j--] = arr[i];
    }
    arr[i] = pivot;
    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}

2. 使用栈方式实现快速排序

public void quickSort(int[] arr, int left, int right) {
    Stack<Integer> stack = new Stack<>();
    stack.push(left);
    stack.push(right);
    while (!stack.isEmpty()) {
        int r = stack.pop(), l = stack.pop();
        if (l >= r) continue;
        int i = l, j = r, pivot = arr[l];
        while (i < j) {
            while (i < j && arr[j] >= pivot) j--;
            if (i < j) arr[i++] = arr[j];
            while (i < j && arr[i] < pivot) i++;
            if (i < j) arr[j--] = arr[i];
        }
        arr[i] = pivot;
        stack.push(l);
        stack.push(i - 1);
        stack.push(i + 1);
        stack.push(r);
    }
}

3. 使用递归方式实现快速排序(优化版)

public void quickSort(int[] arr, int left, int right) {
    if (left >= right) return; // 如果左指针大于等于右指针,直接返回
    int i = left, j = right, pivot = arr[left + (right - left) / 2];
    while (i <= j) {
        while (arr[i] < pivot) i++;
        while (arr[j] > pivot) j--;
        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

4. 使用栈方式实现快速排序(优化版)

public void quickSort(int[] arr, int left, int right) {
    Stack<Integer> stack = new Stack<>();
    stack.push(left);
    stack.push(right);
    while (!stack.isEmpty()) {
        int r = stack.pop(), l = stack.pop();
        if (l >= r) continue;
        int i = l, j = r, pivot = arr[l + (r - l) / 2];
        while (i <= j) {
            while (arr[i] < pivot) i++;
            while (arr[j] > pivot) j--;
            if (i <= j) {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        }
        stack.push(l);
        stack.push(j);
        stack.push(i);
        stack.push(r);
    }
}

5. 使用递归方式实现快速排序(三路快排)

public void quickSort(int[] arr, int left, int right) {
    if (left >= right) return; // 如果左指针大于等于右指针,直接返回
    int i = left, j = right, m = left + (right - left) / 2, pivot = arr[m];
    while (i <= j) {
        while (arr[i] < pivot) i++;
        while (arr[j] > pivot) j--;
        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

6. 使用递归方式实现快速排序(随机快排)

public void quickSort(int[] arr, int left, int right) {
    if (left >= right) return; // 如果左指针大于等于右指针,直接返回
    int i = left, j = right, m = left + (right - left) / 2, pivot = arr[m];
    while (i <= j) {
        while (arr[i] < pivot) i++;
        while (arr[j] > pivot) j--;
        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    int k = left + new Random().nextInt(right - left + 1);
    int tmp = arr[k];
    arr[k] = arr[j];
    arr[j] = tmp;
    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

7. 使用递归方式实现快速排序(枢轴元素选取方法)

public void quickSort(int[] arr, int left, int right) {
    if (left >= right) return; // 如果左指针大于等于右指针,直接返回
    int i = left, j = right, pivot = getPivotElement(arr, left, right);
    while (i <= j) {
        while (arr[i] < pivot) i++;
        while (arr[j] > pivot) j--;
        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
    quickSort(arr, left, j);
    quickSort(arr, i, right);
}

private int getPivotElement(int[] arr, int left, int right) {
    if (right - left <= 5) // 优化,当子序列长度小于等于5时,直接使用插入排序
        return getMedianOfFive(arr, left, right);
    int i, j, k, len = right - left + 1;
    int[] tmp = new int[(len + 4) / 5];
    for (i = left, j = 0; i <= right; i += 5, j++)
        tmp[j] = getMedianOfFive(arr, i, Math.min(i + 4, right));
    int pivot = getPivotElement(tmp, 0, tmp.length - 1);
    for (i = left, j = right; i <= j;) {
        for (; i <= j && arr[i] < pivot; i++);
        for (; i <= j && arr[j] > pivot; j--);
        if (i <= j) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
            i++;
            j--;
        }
    }
    if (j - left + 1 == (len + 1) / 2)
        return pivot;
    if (j - left + 1 > (len + 1) / 2)
        return getPivotElement(arr, left, j);
    return getPivotElement(arr, i, right);
}

private int getMedianOfFive(int[] arr, int left, int right) {
    insertSort(arr, left, right);
    int mid = left + (right - left) / 2;
    return arr[mid];
}

private void insertSort(int[] arr, int left, int right) {
    for (int i = left + 1; i <= right; i++) {
        int tmp = arr[i], j = i - 1;
        for (; j >= left && arr[j] > tmp; j--)
            arr[j + 1] = arr[j];
        arr[j + 1] = tmp;
    }
}

8. 使用递归方式实现快速排序(随机ized select)

`java

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

if (left >= right) return; // 如果左指针大于等于右指针,直接返回

int i = left, j = right, k = left