排序
插入排序
和前面的比,找到对应位置插入
eg. 49 38 65 97 76 13 27 49
1. 49 #前面没人
2. 38 49 #前面只有49,<49,插到前面
3. 38 49 65
4. 38 49 65 97
5. 38 49 65 76 97
6. 13 38 49 65 76 97
7. 13 27 38 49 65 76 97
8. 13 27 38 49 49 65 76 97
希尔排序
对每一个子表进行直接插入排序
子表:设步长:d=4
下表的子表为49 38 65 97 76
38 65 97 76 13
65.....................27
97.....................49
eg. 49 38 65 97 76 13 27 49
设步长为d=4
子表1:49....76 -> 作插入排序 49...76
子表2:38....13 -> 作插入排序 13...38
子表3:65....27 -> 作插入排序 27...65
子表4:97....49 -> 作插入排序 49...97
(优先级:下>右)
----------------------> 49 13 27 49 76 38 65 97
步长d=d/2
子表1:49....27....76....65 -> 作插入排序 27 49 65 76
子表2:13....49....38....97 -> 作插入排序 13 38 49 97
(优先级:下>右)
-------------------------------> 27 13 49 38 65 49 76 97
步长d=d/2
子表1:27 13 49 38 65 49 76 97 -> 作插入排序 13 27 38 49 49 65 76 97
快速排序
小放枢轴左,大放枢轴右
高低所指换,换针向枢轴
高低所遇处,枢轴所落入
递归再排至,左右仅一头
eg. 49 38 65 97 76 13 27 49
枢轴一般取第一个49,即49存入枢轴,空了low指向的值,所以操作先high
枢轴49 | |||||||
38 | 65 | 97 | 76 | 13· | 27 | 49 | |
low指针 | high指针 |
high-49 = 枢轴-49;(相当于大于枢轴, 大放枢轴右)不换,high--
枢轴49 | |||||||
38 | 65 | 97 | 76 | 13· | 27 | 49 | |
low指针 | high指针 |
high-27 < 枢轴-49;( 小放枢轴左)要换,( 高低所指换)low++;
枢轴49 | |||||||
27 | 38 | 65 | 97 | 76 | 13· | 49 | |
low指针 | high指针 |
low-38 < 枢轴-49;不用换,low++;
枢轴49 | |||||||
27 | 38 | 65 | 97 | 76 | 13· | 49 | |
low指针 | high指针 |
low-65 >枢轴-49;要换,放到high,high--;
枢轴49 | |||||||
27 | 38 | 97 | 76 | 13· | 65 | 49 | |
low指针 | high指针 |
high-13 < 枢轴-49;要换,放到low,low++;
枢轴49 | |||||||
27 | 38 | 13· | 97 | 76 | 65 | 49 | |
low指针 | high指针 |
low-97 > 枢轴-49;要换,放到high,high--;
枢轴49 | |||||||
27 | 38 | 13· | 76 | 97 | 65 | 49 | |
low指针 | high指针 |
high-76 > 枢轴-49;不用换,high--;low和high重叠填入枢轴值49( 高低所遇处,枢轴所落入)
枢轴 | |||||||
27 | 38 | 13· | 49 | 76 | 97 | 65 | 49 |
low指针,high指针 |
枢轴左右分两块再按上述操作(递归再排至)
枢轴27 | ||
38 | 13· | |
low | high |
枢轴76 | |||
97 | 65 | 49 | |
low | high |
选择排序
查找最小,放前面,重复
eg. 49 38 65 97 76 13 27 49
1. 13 49 38 65 97 76 27 49
2. 13 27 49 38 65 97 76 49
3. 13 27 38 49 65 97 76 49
4. 13 27 38 49 65 97 76 49
5. 13 27 38 49 49 65 97 76
6. 13 27 38 49 49 65 97 76
7. 13 27 38 49 49 65 76 97
冒泡排序
相邻相比较,小的调换,比较完往后再一一比较
eg. 49 38 65 97 76 13 27 49
1. 49 >38 ,38小,不调换->38<65,38小,调换->38<97,38小,调换...
49 65 97 76 38 27 49 13
2. 65 97 76 49 38 49 27 13
3. 97 76 65 49 49 38 27 13
归并排序
将有序的子数列合并
数列1: 3 6 9 33 数列2: 5 8 10 40 54
指针s1指向3,指针s2指向5
s1指向的3和s2指向的5比较,3小,把3放到数列3中,s1++
数列3: 3
s1指向的6和s2指向的5比较,5小,把5放到数列3中,s2++
数列3: 3 5
s1指向的6和s2指向的8比较,6小,把6放到数列3中,s1++
数列3: 3 5 6
s1指向的9和s2指向的8比较,8小,把8放到数列3中,s2++
数列3: 3 5 6 8
s1指向的9和s2指向的10比较,9小,把9放到数列3中,s1++
数列3: 3 5 6 8 9
s1指向的33和s2指向的10比较,10小,把10放到数列3中,s2++
数列3: 3 5 6 8 9 10
s1指向的33和s2指向的40比较,33小,把33放到数列3中,s1不能++,所以s2指向的数放到数列3,并往后遍历,重复得到
数列3: 3 5 6 8 9 10 33 40 54
eg. 49 38 65 97 76 13 27 49
1. 分为8个子数列
49 38 65 97 76 13 27 49
2.两两数列进行归并排序
38 49 65 97 13 76 27 49
3.再两两数列进行归并排序
38 49 65 97 13 27 49 76
4.两数列再进行归并排序
13 27 38 49 49 65 76 97
稳定:插冒归
复杂度:
n2:选帽插
nlog2n:快归