数据结构之内部排序--排序的基本概念

排序

有n个记录的序列${R_1,R_2,...,R_n}$,其相应的关键字的序列是${K_1,K_2,...,K_n}$,相应的下标序列1,2,...,n。通过排序,找出当前的下标序列1,2,...,n的一种排列$p_1,p_2,...,p_n$,使得相应的关键字满足如下的非递减(或者非递增)关系:$K_{p1} <= K_{p2} <= ... <=K_{pn}$,这样就得到一个按关键字乐有序的记录序列。

内部排序与外部排序

根据排序时数据所占用的存储器的不同,可以将排序分为两大类。一类是整个排序过程完全在内存中进行,称为内部排序;另一类是由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,称为外部排序

主关键字与次关键字

上面所说的关键字$K_i$可以是记录$R_i$的主关键字,也可以是此关键字,甚至可以时记录中若干数据項的组合。若$K_i$是主关键字,则任何一个无序的序列经排序后得到的有序序列是唯一3的;若$K_i$是次关键字或是记录中若干数据項的组合,得到的排序结果可能是不唯一的。

排序的稳定性

若在排序前的的队列中$R_i$领先于$R_j$其中$i<j$,经过排序后得到的序列中$R_i$仍然领先于$R_j$,则称排序方法是稳定的。反之领先关系在排序时发生变化,则称排序方法是不稳定的
无论是稳定的还是不稳定的算法,都可以很好的排序,只不过在某些时候我们需要让他的顺序保持不变。

常用排序的基本类型

1.插入类排序

-直接插入排序
-折半插入排序
-希尔排序
排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
直接插入 稳定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
折半插入 稳定 $O(n^2)$ $O(nlogn)$ $O(n^2)$ $O(1)$
希尔排序 不稳定 $O(n^{1.5})$ $O(1)$

2.交换类排序

-冒泡排序
-快速排序
排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
冒泡排序 稳定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$
快速排序 不稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n^2)$ $O(log_{2^n})$

3.选择类排序

-简单选择排序
-树形选择排序
-堆排序
排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
简单选择排序 不稳定 $O(n^2)$ $O(n^2)$ $O(n^2)$ $O(1)$
树形选择排序 稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$
堆排序 不稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(1)$

4.归并排序

-归并排序
排序算法 稳定性 时间复杂度 最好情况 最坏情况 空间复杂度
归并排序 稳定 $O(nlog_{2^n})$ $O(nlog_{2^n})$ $O(n)$

5.分配类排序

-多关键字排序
-链式基数排序

总结

数据结构在计算机世界里承担很重要的角色。就例如十万个数排序快速排序的时间在0.5s左右(Python编写),而有的排序则需要十几分钟,可想而知,在现在大数据时代,没有一个好的数据结构,没有一个好的算法,对生产来说,十分不利。其次数据结构也大大的提升了自己的逻辑判断水平。对提升自己的编码水平,有很大的帮助,对自己以后研究算法,也会打下坚实的基础。或许这些算法以后用不到,但是我知道,其他复杂的算法都是在基础的算法之上建立的,也应当对这些基础算法进行了解。
此篇文章参考
【1】耿国华,张德同,周全名等.数据结构用c语言描述【M】.第二版.北京:高等教育出版社.2016.

有什么问题请联系我

QQ:3116316431 (请附上信息)
E-mail:wongyinlong@yeah.net

原文地址:https://www.cnblogs.com/Leon-The-Professional/p/9950083.html