数据结构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 多相合并法
- 数据结构8-排序2
- 数据结构 排序2 插入排序
- 数据结构-排序(2):冒泡排序
- 数据结构--8大排序
- 数据结构(8) 归并排序
- 数据结构8-排序1
- 【数据结构8】排序
- 数据结构(2)----排序
- 数据结构----排序2
- 数据结构排序2
- 数据结构-排序算法2
- 插入排序--数据结构2
- 【数据结构之排序8】归并排序
- 数据结构算法----排序(2)----冒泡排序
- 【数据结构之排序2】直接插入排序
- 数据结构 第8章 排序
- 数据结构8:希尔排序专题
- 数据结构排序之总结2
- PHP常用常量
- Window.open()没有生效
- CentOS6.3 yum安装Apache+PHP+Tomcat+MySQL
- 人才热线CJOL.COM 和51job
- 北风网CRM源代码
- 数据结构8-排序2
- PT大全
- 警惕UNIX下的LD_PRELOAD环境变量
- maven项目移除Maven Dependencies后如何在添加进去
- Slider Revolution
- 2016网易实习生招聘笔试题:已知一般App版本为1.0.0/1.0.1/1.2.3,其符合a.b.c的规则。将排序不规则,约为100w个版本号进行从小到大排序
- 现场六大问题分析与对策
- java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/Co
- 支付宝红包稳定性实践与思考--讲座思考