Java排序之快速排序
快速排序
一、基本概念
首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这样就将序列分为两个子序列。这个过程称为一趟快速排序。
详细步骤:
- 设两个变量i,j。i指向最左边,j指向最右边
- 选数组第一个元素为基准点pivot,即pivot=array[0]
- 从后开始向前搜索,即j--,直到找到第一个array[j]<pivot,交换array[i]与array[j]
- 从前向后搜索,即i++,直到找到第一个array[i]>pivot,交换array[i]与array[j]
- 重复3、4两步,直到i==j,此时i与j重合
二、算法特点
是否稳定:false
平均时间复杂度:O(nlogn)
最差时间复杂度:O(n^2) (每一次总是选到最小或最大值作为基准点)
最优时间复杂度:O(nlogn) (每次都恰好选到中间值作为基准点)
三、相关代码
方法一:
public static void quick_sortA(int[] data, int low, int high) { if (low >= high) return; int i = low; int j = high; int pivot = data[low]; while (i < j) { while (i < j && pivot < data[j]) {// 从右开始 j--; } if (i < j) { // 位于基准点右边且小于基准点 data[i] = data[j]; i++; } while (i < j && pivot > data[i]) {// 左边 i++; } if (i < j) { // 位于基准点左边且大于基准点 data[j] = data[i]; j--; } } data[i] = pivot; quick_sortA(data, low, i - 1); quick_sortA(data, i + 1, high); }
方法二:
public static void quick_sortB(int[] data, int low, int high) { int pivot; if (low < high) { pivot = partition(data, low, high); quick_sortB(data, low, pivot - 1); quick_sortB(data, pivot + 1, high); } } public static int partition(int[] data, int low, int high) { int pivot = data[low]; while (low < high) { while (low < high && pivot <= data[high]) { high--; } data[low] = data[high]; while (low < high && pivot >= data[low]) { low++; } data[high] = data[low]; } data[low] = pivot; return low; }
测试:
public static void main(String[] args) { int[] a = { 2,5, 5, 3, 9, 6, 1, 4, 8,7}; quick_sortA(a, 0, a.length - 1); printArray(a); } public static void printArray(int[] data) { if (0 == data.length) { return; } for (int i : data) { System.out.print(i + " "); } }
运行结果:
1 2 3 4 5 5 6 7 8 9