快速排序

109 阅读3分钟

快速排序算法

快速排序是一种常用的排序算法,其基本思想是通过不断地将待排序数组分割为较小和较大的两个子数组,然后递归地对子数组进行排序,最终完成整个数组的排序。

具体步骤如下:

  1. 选择一个基准元素,通常为待排序数组的第一个元素。
  2. 将数组划分为两个子数组,小于等于基准元素的放在左边,大于基准元素的放在右边。
  3. 递归地对左右子数组进行步骤1和步骤2,直到子数组长度为1或0,此时子数组已经有序。
  4. 合并排序完的左子数组、基准元素和排序完的右子数组,得到完整的有序数组。

快速排序的优点是排序效率高,速度快,尤其对于大数据量的排序表现更为突出。但是在最坏情况下,快速排序的时间复杂度为O(n^2),所以在实际应用中,可以采用一些优化的策略来避免最坏情况的发生,比如随机选择基准元素、三数取中法等。

Java实现的快速排序算法的示例代码:

public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivotIndex = partition(arr, low, high); // 将数组划分为两部分,并返回基准元素的索引 quickSort(arr, low, pivotIndex - 1); // 对左子数组进行递归排序 quickSort(arr, pivotIndex + 1, high); // 对右子数组进行递归排序 } } private static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择第一个元素作为基准元素 int i = low, j = high; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i] = arr[j]; i++; } while (i < j && arr[i] <= pivot) { i++; } if (i < j) { arr[j] = arr[i]; j--; } } arr[i] = pivot; // 将基准元素放到正确的位置上 return i; // 返回基准元素的索引 } public static void main(String[] args) { int[] arr = {5, 2, 6, 1, 3, 9, 4, 8, 7}; quickSort(arr, 0, arr.length - 1); System.out.println("排序后的数组:"); for (int num : arr) { System.out.print(num + " "); } } }

以上代码演示了如何使用递归实现快速排序算法。在quickSort方法中,我们选择数组第一个元素作为基准元素,然后通过partition方法将数组划分为两部分,并返回基准元素的索引。接着,使用递归对左右两个子数组进行排序,直到子数组长度为1或0。最终,将排序完的子数组合并在一起,得到完整的有序数组。

partition方法中,使用双指针的方式将数组分割为两部分。首先,从数组右侧开始找到第一个小于基准元素的元素,然后将该元素移到左侧。接着,从数组左侧开始找到第一个大于基准元素的元素,然后将该元素移到右侧。如此循环,直到左指针和右指针相遇。最后,将基准元素放到正确的位置上,并返回基准元素的索引。

运行以上代码,输出结果为:1 2 3 4 5 6 7 8 9,表示排序完成的数组。