快速排序
快速排序是交换排序(冒泡排序也是交换排序)的一种,时间复杂度可达到$(nlog_2n)$。快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
思路在于分治的策略,该方法的基本思想是:
1.先从数列中取出一个数作为基准数。 找
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 分
3.再对左右区间重复第二步,直到各区间只有一个数。 重复
Java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package sort.exchange;
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner;
public class QuickSort { public static void main(String[] args) { Integer[] arr = {6, 54, 32, 21, 9, 100}; System.out.println("排序前:" + Arrays.toString(arr)); System.out.println("排序后:" + Arrays.toString(quickSort(arr, 0, arr.length-1))); }
public static Integer[] quickSort(Integer[] arr, int low, int high) { if (low > high) { return arr; } int i = low; int j = high; Integer t; Integer temp = arr[low]; while (i < j) {
while (temp <= arr[j] && i < j) { j--; }
while (temp >= arr[i] && i < j) { i++; } if (i < j) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
arr[low] = arr[i]; arr[i] = temp; quickSort(arr,low,j-1); quickSort(arr,j+1,high);
return arr; }
public static Integer[] scanNum() { Scanner sc = new Scanner(System.in); ArrayList<Integer> list = new ArrayList<>(); System.out.print("输入一串数字,空格分开,以#结束:"); while (!sc.hasNext("#")) { int a = sc.nextInt(); list.add(a); }
return list.toArray(new Integer[0]); }
}
|
运行结果
总结
核心思想 分治, 以基准为中心,两头交换,左侧的统一大于(或小于)基准,右侧相反同理。