Java 函数实现快速排序算法及其优化策略
快速排序(Quick Sort)是一种基于比较的排序算法,它采用分而治之的策略,将原始数组递归地分成更小的子数组,以便进行排序。每次递归都选择一个基准元素(pivot),将数组分成两部分:小于基准元素的部分和大于基准元素的部分。然后将子数组按照同样的方式递归排序。
快速排序的核心思想是在不断缩小待排序范围的同时,保持基准元素的位置不变,这样就能减少比较的次数,提高排序效率。因此,选择合适的基准元素对快速排序的效率非常重要。一般来说,可以选择 个元素、中间元素或随机元素作为基准元素。
快速排序的时间复杂度为O(nlogn)。但是,如果选择的基准元素不合适,可能会导致快速排序的时间复杂度变为O(n^2),这是一种最坏的情况。因此,快速排序需要在实现过程中加入一些优化策略,以避免最坏情况的出现。
下面给出Java代码实现快速排序及其优化策略:
/**
* 快速排序
* @param arr 待排序数组
* @param left 左边界
* @param right 右边界
*/
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
// 优化1:选择中位数作为基准元素
int mid = (left + right) >>> 1;
if (arr[left] > arr[right]) {
swap(arr, left, right);
}
if (arr[mid] > arr[right]) {
swap(arr, mid, right);
}
if (arr[mid] > arr[left]) {
swap(arr, mid, left);
}
int pivot = arr[left]; // 基准元素
int i = left + 1, j = right;
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, left, j); // 将基准元素放到正确位置
// 优化2:递归较小的子数组,减少递归次数
if (j - left < right - j) {
quickSort(arr, left, j - 1);
quickSort(arr, j + 1, right);
} else {
quickSort(arr, j + 1, right);
quickSort(arr, left, j - 1);
}
}
/**
* 交换数组中的两个元素
*/
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
上述代码中的优化策略有两个:
选择中位数作为基准元素:相比于随机选择基准元素或选择 个元素作为基准元素,选择中位数能够更加准确地划分子数组,从而减少比较次数。
递归较小的子数组:快速排序时,若子数组长度较短,则直接采用插入排序等简单排序算法进行排序,这样可以将递归树变得更加平衡,减少递归次数。
总之,快速排序是一种非常高效的排序算法,但是它也需要根据具体情况选择合适的优化策略。此外,还要注意快速排序的实现细节,如基准元素的选择、子数组边界的判断等,以保证正确性和效率。
