排序法 |
最好时间分析 |
最差时间分析 |
平均时间复杂度 |
稳定度 |
空间复杂度 |
冒泡排序 |
O(n)(改进的冒泡排序) |
O(n2) |
O(n2) |
稳定 |
O(1) |
快速排序 |
|
O(n2) |
O(n*log2n) |
不稳定 |
O(log2n)~O(n) |
选择排序 |
|
O(n2) |
O(n2) |
不稳定(也可以有稳定的实现) |
O(1) |
二叉树排序 |
|
O(n2) |
O(n*log2n) |
|
O(n) |
插入排序 |
|
O(n2) |
O(n2) |
稳定 |
O(1) |
堆排序 |
|
O(n*log2n) |
O(n*log2n) |
不稳定 |
O(1) |
希尔排序 |
|
|
|
不稳定 |
O(1) |
冒泡排序算法的运作如下:(从后往前)
代码:
public void bubbleSort(int num[]) { for (int i = 0; i < num.length; i++) { for (int j = 0; j < num.length - 1 - i; j++) { if (num[j] > num[j + 1]) { int temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; } } } }性能分析:
需要n(n-1)/2次比较,复杂度为O(n^2),最差最好都是O(n^2),空间复杂度为O(1),但是如果排好序的很明显一次都不用移动,应该是O(n)才对。
加了一个标志位来判断是否有过交换。使最好的排序复杂度为O(n)
public void bubbleSort(int num[]) { boolean swap = false; for (int i = 0; i < num.length; i++) { swap = false; for (int j = 0; j < num.length - 1 - i; j++) { if (num[j] > num[j + 1]) { int temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; swap = true; } } if (!swap) { break; } } }
原文:http://my.oschina.net/hosee/blog/521245