| 排序法 |
最好时间分析 |
最差时间分析 |
平均时间复杂度 |
稳定度 |
空间复杂度 |
| 冒泡排序 |
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