常用排序速记(学渣专用)
插入类:直接插入、折半插入、希尔排序
交换类:起泡排序、快速排序
选择类:简单选择、堆排序
二路并归
基数排序
其中不稳定的是:快些选 一 堆
++++++++++ 快速+希尔+选择+堆排序
排序的趟数与初始排列无关的是:鸡 龟 插入 哲学班 学 习 一趟
+++++++++++++++++++++基数+归并+插入+折半+选择+希尔
排序的比较次数与初始排列无关的是:鸡 龟 哲 学 比较无关
++++++++++++++++++++++++++基数+归并+折半+选择
打这么多加号是因为我打不出来空格
直接插入
- 简单例子
3 5 2 4 1
35 2 4 1
3 52 4 1
2 3 54 1
2 3 4 51
1 2 3 4 5 - 时间复杂度 O(n2)
- 空间复杂度 O(1)
- 稳定
折半插入
- 简单例子
有序 | 无序 |
---|---|
235 | 41 |
1.4与3比 再与5比
有序 | 无序 |
---|---|
2345 | 1 |
2.1与3比,再与2比
有序 | 无序 |
---|---|
12345 |
这个为什么这么宽?我该怎么调?疯了。
- 时间复杂度 最好O(nlogn) 最差O(n2)平均 O(n2)
- 空间复杂度 O(1)
- 稳定
希尔排序
-
简单例子
3 5 2 4 1 6
希尔说 n/2向下取整
以3为增量:
3为4
啥 5 吃 1
我空2 格 6
排完一趟:
3 为 4
啥 1 吃 5
我空2 格 6以1为增量排完:
1 2 3 4 5 6
==心好累。==标黄
。。。
不标拉倒,一点都不智能!小拳拳谴责程序员!
- 时间复杂度 O(n2)
- 空间复杂度 O(1)
- 不稳定
起泡排序
- 简单例子
3 5 2 4 1
选出最大的放最后:
3 2 4 1 5
很多年之后:
1 2 3 4 5
代码:
flag=0;
{交换
flag=1}
flag==0,return;
- 时间复杂度 O(n2)
- 空间复杂度 O(1)
- 稳定
快速排序
-
简单例子
3 5 2 4 1
i又j
j往左找比i小的,找到就交换
i j
i再往右找比i大的找到就交换
i j
ij相遇就结束,此时的位置就是i的最终位置
吃ij -
时间复杂度 最好O(nlogn) 最差O(n2)平均 O(nlogn)
-
空间复杂度 O(logn)
-
不稳定
简单选择排序
- 简单例子
有序 | 无序 |
---|---|
23541 |
选最小的放到前面
有序 | 无序 |
---|---|
1 | 2354 |
再选最小的放到前面
有序 | 无序 |
---|---|
12 | 354 |
最后
有序 | 无序 |
---|---|
12345 |
表格也不显示了,我明明什么都没动,它自己消失了
我!@#¥%%……&&
忍。
2. 时间复杂度 O(n2)
3. 空间复杂度 O(1)
4. 不稳定
堆排序
-
简单例子
23541
化成大顶堆
2
3 5
4 1
求求你别再吃我的空格了
仿佛上面是一棵树哈
然后将堆顶关键字2跟3 5比,与最大的5交换,5放在顶上
此时,5已经到了它最终位置
就完成了一趟
然后下面的再继续直到完成
- 时间复杂度 O(nlogn)
- 空间复杂度 O(1)
- 不稳定
二路归并
-
简单例子
23451分成5个子序列:
2
3
4
5
1
两两归并:
23
45
1
继续两两归并:
2345
1
最后:
12345 -
时间复杂度 O(nlogn)
-
空间复杂度 O(1)
-
稳定
基数排序(桶排序)
- 简单例子
232 114 156 464
低位优先:
按个位数排序:
232 114 464 156
按照十位排序:
114 232 156 464
按百位排序:
114 156 232 464
成功了!神奇吧!
【ps:桶是队列,先进先出】
2. 时间复杂度 O(d(n+rd))
n为关键字数,d为关键字的关键字位数
比如930 d=3
是十进制,数字有0~9,rd=10
3. 空间复杂度 O(rd)
4. 稳定
如果再给我一次机会,我希望我能把用户名改成vegetable bird