参考文章
排序算法详解
冒泡排序
两两比较 按顺序交换
1.两两比较,质量大的下沉,质量小的上浮;
2.外层循环用于控制排序次数,n个数需要n-1次;
3.内层循环用于两两比较,每次找出最大的沉到最底部;
for(i=1; i<n; i++)
{
for(j=0; j<n-i; j++){
if(ary[j] > ary[j+1]){
temp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = temp;
}
}
}
选择排序
找到当前最大值 与最后一位作比较,谁大谁放最后一位
直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,
顺序放入新数组,直到全部拿完
1.每次获取一个关键字与它后面的数进行一一比较,找出最小的数与关键字进行交换;
2.外层循环用于获取关键字,同时控制循环次数(n个数需要n-1次);
3.内层循环用于将关键字与它后面的数一一比较,找出最小的数与关键字进行交换;
for(i=0; i<n-1; i++){
for(j=i+1; j<n; j++){
if(ary[i] > ary[j]){-->这里ary[i]就是关键字
temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
}
}
插入排序
一部分有序 一部分无序,每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕
希尔排序
基于插入排序
快速排序
分而治之,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
时间复杂度
| 时间复杂度(大O) | 排序算法 | 比较次数(具体) | 比较次数(大O) | 交换次数(具体) | 交换次数(大O) |
|---|---|---|---|---|---|
| O(N²) | 冒泡排序 | N(N-1)/2 | O(N²) | ≈N²/4 | O(N²) |
| O(N²) | 选择排序 | N(N-1)/2 | O(N²) | N-1 | O(N) |
| O(N²) | 插入排序 | ≈N²/4(平均) | O(N²) | ≈N²/4(平均) | O(N²) |
| O(N²)(最坏),通常更好 | 希尔排序 | 取决于增量序列 | O(N²)(最坏) | 取决于增量序列 | O(N²)(最坏) |
| O(N log N)(平均) | 快速排序 | ≈1.39N log N(平均) | O(N log N) | ≈0.3N log N | O(N log N) |
说明:
-
冒泡排序
- 比较次数固定为等差数列和
N(N-1)/2,交换次数在平均情况下约为N²/4。 - 时间复杂度和交换次数均为 O(N²) 。
- 比较次数固定为等差数列和
-
选择排序
- 比较次数与冒泡排序相同,但交换次数仅需
N-1次(每轮交换一次最小值)。 - 时间复杂度为 O(N²) ,但交换次数优化为 O(N) 。
- 比较次数与冒泡排序相同,但交换次数仅需
-
插入排序
- 平均比较和交换次数均为
N²/4(基于逆序对的期望值),但最坏情况下为N²/2。 - 时间复杂度仍为 O(N²) 。
- 平均比较和交换次数均为
-
希尔排序
- 实际性能依赖于增量序列(如原始增量最坏为 O(N²) ,Hibbard 增量优化为 O(N^1.5) )。
- 通常优于 O(N²) ,但最坏情况仍保留平方复杂度。
-
快速排序
-
平均比较次数约为
1.39N log N(接近理论下限N log N),交换次数约为其 1/3。 -
平均时间复杂度为 O(N log N) ,但最坏情况下退化为 O(N²) (如已排序数组)。
-
作者:Lafar
链接:juejin.cn/post/748122…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。