数据结构中的各种内部排序的排序过程

来源:互联网 发布:数控编程什么软件好用 编辑:程序博客网 时间:2024/06/05 18:01

总结自《数据结构教程》,书上的太理论化了,本文简单梳理一下给你一组数字怎么去排序。本篇不涉及代码和理论,只说说排序过程。


一、插入排序:

【例子】序列:5,7,9,3,1

第一趟:[5] 7 9 3 1

第二趟:[5 7] 9 3 1

第三趟:[5 7 9] 3 1

第四趟:[3 5 7 9] 1

第四趟:[1 3 5 7 9]


[ ]内是已经排好序的,剩下是待排的

①选取待排的第一个数

②和[ ]内的值比较,放在相应位置

③重复执行①②,直到排完。


整个排序过程需要进行n(n-1)/2次比较。

所需的结点比较次数最少为n-1

最多为n(n-1)/2


二、选择排序

例:一组数5,8,2,9,6,选择排序。

第一趟:[2] 5 8 9 6

第二趟:[2 5] 8 9 6

第三趟:[2 5 6] 8 9

第四趟:[2 5 6 8] 9

第五趟:[2 5 6 8 9]


类似于插入,只不过这次是选择待排序列中最小值跟已经排好的比较。


比较次数为n/n-1)/2,时间复杂度O(n²)


三、冒泡排序


例:7,3,8,2,9

第一趟:3 7 2 8 9

第二趟:3 2 8 9

第三趟:2 3 7 8 9


待排序的n个结点已排序,则只要执行一遍比较结束排序。即n-1

整个排序过程最多进行n(n-1)/2次比较。



四、合并排序

例:10,8,12,7,5,合并排序

第一趟:(8,10)(7,12)5

第二趟:(7,8,10,12)5

第三趟:5,7,8,10,12

简而言之就是先分组再排序。

分组的元素数量呢,第一次每组两个,那么第二次每组就是四个,第三次每组就是八个……

倒数第二次就是前面的所有元素一组,跟最后一个元素单独一组,一共两组。比较。

然后就大功告成。


合并排序的执行时间是O(nlog2n)


五、快速排序

快排就是很快的意思啦~

例子:46,26,22,68,48,42,36,84,66

趟数 控制值 序列

0 46 [46 26 22 68 48 42 36 84 66]

1 36/48 [36 26 22 42] 46 [48 68 84 66]

22/68 [22 26] 36 [42] 46 48 [68 84 66]

3 26/68 22 [26] 35 42 46 48 [66] 68 [84]

26/66/8422 26 36 42 46 48 66 68 84


①首选选取控制值(通常是第一个结点)

②两个指针i和j分别标上一头一尾

③从尾开始,找到比控制值小的数值就挪到前面i的位置,否则把这个值抄下放在对应位置。

④然后从头开始,遇到控制值小的就放到后面j的位置,否则把这个值抄下放在对应位置。

⑤两个指针重合时,说明除了控制值之外的值已经扫描结束(但并不意味着排序好了),在这个位置上把控制值插入进去。

⑥本趟结束,执行第二趟,此时第一趟的控制值作为分支,不看,剩下的值被另外分组,然后从分组里面开设执行①~⑤趟。

⑦重复执行直到排序完成。


在什么情况下,快速排序需要的排序次数比较多?

答:每次所选的控制值为最小值。时间复杂度为O(n²)


六、基数排序

例:92 35 67 76 84 51

第一趟:51→92→84→35→67→76
第二趟:35→51→67→76→84→92

基数排序中,第一趟把个位按从小到大排序,第二趟把十位按从小到大排序。



七、各种排序的稳定性

稳定的:

1、插入排序。适合结点个数较少的场合。

2、冒泡排序。值相等的结点不会互相交换。

3、合并排序。

4、基数排序。

不稳定的:

1、选择排序

2、希尔排序

3、快速排序

4、堆排序












原创粉丝点击