一、算法复杂度对比
总之,
在平均情况下,快速排序最快;
在最好情况下,冒泡排序和直接插入排序最快;
在最坏情况下,堆排序和归并排序排序速断最快。
常见的算法时间复杂度由小到大依次为:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
二、排序算法说明
1. 冒泡排序
运作如下:
a. 比较相邻元素,如果前一个比后一个大,就把它们调换位置
b. 对每一对相邻的元素做同样的工作,从开始第一对到结束最后一对。这步做完,最后的元素就是最大的元素
c. 针对所有元素重复以上的步骤,除了最后一个
d. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
口诀: 外层循环n-1,内层循环n-1-i.
例子:
1 public static void main(String[] args) { 2 int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 3 SortCommon.bubbleSort(arr); 4 } 5 6 public static void bubbleSort(int[] arr) { 7 boolean didSwap; 8 for (int i = 0; i < arr.length - 1; i++) { 9 didSwap = false; 10 for (int j = 0; j < arr.length - 1 - i; j++) { 11 if (arr[j] > arr[j + 1]) { 12 swap(arr, j, j + 1); 13 didSwap = true; 14 } 15 } 16 17 if (didSwap == false) { 18 break; 19 } 20 21 System.out.println(Arrays.toString(arr)); 22 23 } 24 25 } 26 27 private static void swap(int[] arr, int index1, int index2) { 28 int tempValue = arr[index1]; 29 arr[index1] = arr[index2]; 30 arr[index2] = tempValue; 31 }
// 排序执行结果
[8, 7, 6, 5, 4, 3, 2, 1, 0, 9]
[7, 6, 5, 4, 3, 2, 1, 0, 8, 9]
[6, 5, 4, 3, 2, 1, 0, 7, 8, 9]
[5, 4, 3, 2, 1, 0, 6, 7, 8, 9]
[4, 3, 2, 1, 0, 5, 6, 7, 8, 9]
[3, 2, 1, 0, 4, 5, 6, 7, 8, 9]
[2, 1, 0, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
快速排序
-
直接插入排序
-
shell排序
-
直接选择
-
堆排序
-
归并排序
-
基数排序