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

使用Java实现的快速排序函数

发布时间:2023-05-27 02:40:41

快速排序是经典的递归算法,用来将一个无序序列按照一定的顺序进行排序。快速排序的基本思想是将整个序列分成两部分,分别进行排序,其中一部分的所有元素都小于另一部分的所有元素,因而可以选择一个元素作为枢轴(pivot),通过一次排序,把两部分分别排好序。

实现代码

下面是使用Java实现的快速排序函数代码。

public class QuickSort {
    public void quickSort(int[] arr, int low, int high) {
        if (arr == null || arr.length == 0 || low >= high) {
            return;
        }

        int i = low, j = high;
        int pivot = arr[low + (high - low) / 2];

        while (i <= j) {
            while (arr[i] < pivot) {
                i++;
            }
            while (arr[j] > pivot) {
                j--;
            }

            if (i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
        }

        if (low < j) {
            quickSort(arr, low, j);
        }
        if (high > i) {
            quickSort(arr, i, high);
        }
    }

    public static void main(String[] args) {
        QuickSort quickSort = new QuickSort();
        int[] arr = { 3, 7, 6, 1, 8, 5, 9, 2, 4 };
        quickSort.quickSort(arr, 0, arr.length - 1);

        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

在这个代码中,quickSort()函数接收一个数组和数组的下标范围,其中low表示排序的起始位置,high表示排序的终止位置。如果传入的数组为null,或者数组没有元素,或者low大于等于high,则返回。

接下来,函数定义了两个变量,i和j,并以数组中间位置的元素为枢轴(pivot)。在while循环中,通过比较数组元素与枢轴大小来进行交换。当i小于等于j时,交换ai 和aj坐标上的元素,并将i和j分别加1和减1。

随后,递归调用quickSort()函数对数组的左半边进行排序。如果low小于j,则在区间[low, j]上调用quickSort()函数,将左半边进行排序。同样,如果i小于high,则在区间[i, high]上调用quickSort()函数,将右半边进行排序。

快速排序的时间复杂度为O(nlogn),是同样时间复杂度的排序算法中 的,但它不是一个稳定的排序算法,即相同的元素排序后其顺序还是原来的顺序。这个算法可能会对大量重复元素的数组进行一定程度的过度分割,使得一部分数多次被交换,导致效率降低,并且快速排序最差情况的时间复杂度是O(n2)。