Java函数实现如何对数组进行快速排序?
发布时间:2023-06-12 17:01:44
快速排序是一种基于分治思想的排序算法,它的核心思想是通过一次排序将数组分成两个部分,左边部分的所有元素都小于右边部分的元素,并且左右两个部分的元素都是已经排好序的。接着分别递归地对左半部分和右半部分进行排序,最终得到一个完全有序的数组。
以下是一个基于Java实现的快速排序函数:
public static void quickSort(int[] arr, int low, int high) {
// 如果数组为空或者只有一个元素,则已经排好序,直接返回
if (arr == null || arr.length < 2 || low >= high) {
return;
}
// 确定枢轴元素,将数组分成左右两部分
int pivotIndex = partition(arr, low, high);
// 递归地对左半部分和右半部分进行排序
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
// 将数组分成两个部分,左半部分小于枢轴元素,右半部分大于枢轴元素
public static int partition(int[] arr, int low, int high) {
// 取 个元素作为枢轴元素
int pivot = arr[low];
int i = low + 1;
int j = high;
while (i <= j) {
// 从左边开始,找到 个大于枢轴元素的元素
while (i <= j && arr[i] < pivot) {
i++;
}
// 从右边开始,找到 个小于枢轴元素的元素
while (i <= j && arr[j] > pivot) {
j--;
}
// 交换左右两个元素位置
if (i < j) {
swap(arr, i, j);
}
}
// 把枢轴元素放到正确的位置上
swap(arr, low, j);
// 返回枢轴元素的位置
return j;
}
// 交换两个元素位置
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
该函数包含三个部分:快速排序函数 quickSort、分割数组函数 partition 和交换元素位置函数 swap。
快速排序函数首先检查数组是否为空或只有一个元素,如果是,则认为数组已经排好序,直接返回。接着调用分割数组函数 partition,将数组分成左右两部分,其中,左半部分所有元素小于枢轴元素,右半部分所有元素大于枢轴元素。然后递归地对左半部分和右半部分分别进行排序,最终得到一个排好序的数组。
分割数组函数 partition 首先选取左边 个元素作为枢轴元素 pivot,然后从左边开始找到 个大于枢轴元素的元素,从右边开始找到 个小于枢轴元素的元素。如果左边和右边找到的元素分别位于枢轴元素的左侧和右侧,则交换这两个元素的位置。在整个过程中,左边指针 i 和右边指针 j 都是从两端向中间逼近的,直到它们相遇为止。最后,把枢轴元素放到正确的位置上,该位置的索引即为 j,并且返回该索引值。
交换元素位置函数 swap 用来交换两个数组元素的位置。
总的来说,快速排序算法的时间复杂度为 $O(n \log n)$,空间复杂度为 $O(\log n)$。它比大多数 $O(n^2)$ 的排序算法都要快,是常用的排序算法之一。
