java排序算法之快速排序
基本思想
快速排序(QuickSort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:
- 从要排序的数据中取一个数为“基准数”。
- 通过一趟排序将要排序的数据分割成独立的两部分,其中左边的数据都比“基准数”小,右边的数据都比“基准数”大。
- 然后再按步骤2对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
该思想可以概括为:挖坑填数 + 分治法。
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
public class QuickSort { private static void quickSort(int[] array, int low, int high) { if (low >= high) { return; } int i = low, j = high, index = array[i]; // 取最左边的数作为基准数 while (i < j) { while (i < j && array[j] >= index) { // 向左寻找第一个小于index的数 j--; } if (i < j) { array[i++] = array[j]; // 将array[j]填入array[i],并将i向右移动 } while (i < j && array[i] < index) {// 向右寻找第一个大于index的数 i++; } if (i < j) { array[j--] = array[i]; // 将array[i]填入array[j],并将j向左移动 } } array[i] = index; // 将基准数填入最后的坑 quickSort(array, low, i - 1); // 递归调用,分治 quickSort(array, i + 1, high); // 递归调用,分治 } public static void quickSort(int[] array) { if (array == null || array.length == 0) { return; } quickSort(array, 0, array.length - 1); } }
图解:
核心步骤:
1、选择一个基数,一般以第一个作为基数。
2、从右到左扫描,发现比基数小的,互换。相等的可以不处理。
3、从左到右扫描,发现比基数大的,互换。相等的可以不处理。
重复2 , 3直到 i,j 相等。
这样基数左边的都比基数小,基数右边的都比基数大。
4、对基数左边和右边的区间进行以上相同的操作。
结束!