数据结构8-排序2

来源:互联网 发布:linux 卸载u盘 编辑:程序博客网 时间:2024/04/30 14:06

8.2.6 快速排序法

快速排序法是目前公认的最佳排序法,他的原理和冒泡排序法一样都是利用交换的方式,不过它会先在数据中找到一个值称为支点,把小于支点的数据放在左边,而大于支点的数据放在右边,再以同样的方式处理左右两边数据,直到完成为止。

步骤如下:

对于键值集合K1,K2........Kn,快速排序步骤如下:

1)取K为第一个键值(支点);

2)由左向右找出一个键值Ki,使得Ki>K;

3)由右向左找出一个键值Kj,使得Kj<K;

4)若i<j,则Ki与Kj交换,执行2;

5)如果i>j,则K与Kj呼唤,以j为基准点将数据分为左右两个部分。在以递归的方式分别为左右两边进行排序,直至完成排序。

原理图:


8.2.7 堆排序法

堆排序法可以算是选择排序法的改进版,他可以减少在选择排序法中的比较次数,进而减少排序的时间。堆排序法利用二叉堆完成排序。二叉堆是一种特殊的二叉树,可分为最大堆和最小堆。

最大堆:

1)它是一棵完全二叉树;

2)所有结点的值都大于或等于它的左右子结点的值;

3)树根的值是树中最大的。

最小堆:

1)它是一棵完全二叉树;

2)所有结点的值都小于或等于它的左右子结点的值;

3)树根的值是树中最小的。二叉树转换成二叉堆:就是将整个树种的子结点值与父结点进行对比,如果大于(小于)则调换,这样父结点就可以使最大(最小)值。从而变成最大堆或者最小堆。

原理图:


用二叉堆来进行排序:

1)每一个二叉堆的树根都是最大(最小)值;

2)移除树根,将该值存入链表

3)对于这个不完全的树,重新建立最大(最小)二叉堆;

4)重复步骤2;

5)完成数组的从大到小或者从小到大的排序。

特性:

1)所有情况下时间复杂度均为O(nlog2n) ; //2表示以2为底

2)堆排序法不是稳定排序法;

3)只需要一个额外空间,空间复杂度为O(1)。

8.2.8 基数排序法

基数排序法又称为桶排序法,和之前所讨论的排序算法不同,他并不需要进行元素间的比较操作,而是属于一种分配排序方式。基数排序法的比较方向可以分为最高优先MSD和最低位优先LSD两种。MSD法是从最左边的位数开始比较,而LSD则是从最右边的位数开始比较。

简而言之,就是

1)把每个整数按照个位数字放在链表中;

2)按照十位数字放在链表中,并将不含有十位数字的放在一起进行一次排序;

3)按照百位数字放入链表中,将不含有百位数字放在一起进行一次排序。

特性:

1)所有情况下,时间复杂度均为O(nlogp k),其中p为底数,表示数据的位数,k表示原始数据的最大值;

2)基数排序法是稳定排序法;

3)基数排序法会使用到很大的额外空间来存放序列数据,其空间复杂度为O(n*p),其中n是原始数据的个数,p是数据的位数;

4)若n很大,p固定或者很小时候,此排序法拥有很高的效率。


8.3 外部排序法

当所有的排序数据太多或者文件太大时候,无法直接在内存中进行排序,则需要依赖外部存储装置时,就会使用到外部排序法。外部存储装置可以按照存取的方式分为两种:顺序存取或者随机存取。

8.3.1 直接合并排序法

1)将待排序的数据文件分成几个小部分文件,然后对各个小文件进行内部排序;

2)合并小文件,两两合并之后把所有文件合并成一个文件即可。

8.3.2 k-路合并法

8.3.3 多相合并法


0 0
原创粉丝点击