【数据结构】排序——内部排序


【数据结构】排序——内部排序

内部排序:在排序期间元素全部存放在内存中的排序

排序算法一览

各算法简述

  • 插入排序

基本思想:每次将一个带排序的记录按其关键字的大小插入到前面已经排好的序列中,直到全部记录插入完成。
1、直接插入排序
基本思想:将整个序列划分为有序和无序序列——>每次从无序序列中取出一个元素,然后在有序序列中遍历,需找合适的位置将该元素插入有序序列中——>自插入的位置开始有序序列向后移动一个位置。
适用于 顺序存储和链式存储
2、折半插入排序
基本思想:确定折半插入排序的范围——>对其进行类似于二分法定界的放手不断缩小范围——>对数据进行移动,对带排序进行插入。
该算法比较次数仅与表中元素个数有关
适用于 顺序存储
3、希尔排序
基本思想:将带排序表分割成若干形如L[i,i+d,i+2d...]的子表对各个子表分别进行直接插入排序,缩小增量d,重复上述操作,直到d=1为止。
适用于 顺序存储

  • 交换排序

基本思想:根据序列中两个元素关键字的比较结果来对这两个记录在序列中的位置
1、冒泡排序
基本思想:从前往后(或从后往前)两两比较相邻元素的值,若为逆序,择机哦啊还他们,直到序列比较完——>将最小(最大)元素交换到带排序序列的第一个位置(最后一个位置)——>进行下一趟冒泡时,前一趟确定的最小(或最大)元素不再参与比较,每趟冒泡的结果是把序列中的最小(或最大)元素放到了序列的最终位置——>如果某一趟排序过程中未发生“交换”,则算法可提前结束。
适用于 顺序存储
2、快速排序:目前基于比较的内部排序方法中最好的方法
基本思想:选取一个元素作为枢轴,一次枢轴为界分为两个部分,左面小于该枢轴,右面大于该枢轴值——>再对这两个部分分别递归的进行上述步骤
该算法的运行时间与划分是否对称有关
适用于 顺序存储

  • 选择排序

基本思想:每一趟(如第i趟)在后面n-i+1(i=1,2...n-1)个带排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到n-1趟做完,带排序元素只剩下1个,就不用再选。
1、简单选择排序
基本思想:将表分为有序和无序两个部分,每次从无序部分中选取最小的元素,然后将其放入有序部分中。
该算法元素间比较的次数与序列的初始状态无关
适用于 顺序存储
2、堆排序
小根堆(根>左、右)大根堆(根 <左、右)
基本思想:建堆:按照大根堆(或小根堆)的规则建立相应的二叉树,那么根结点一定是最大值(或最小值)——>调整堆:当根结点输出后,整棵二叉树可能被破坏,这时根据相应的建堆规则,自底向上,自左向右,进行父结点与子节点交换以满足建堆规则。

  • 归并排序

基本思想:每次选定相应的元素分别合成一个新的有序表

(2路归并)
适用于 顺序表

  • 基数排序

基本思想:不基于比较和移动的排序,而基于关键字各位的大小进行排序。

小结

  • 若n较小,可采用直接插入排序简单选择排序
  • 若n较大,可采用快速排序堆排序归并排序
  • 若n很大,记录的关键字位数较少且可以分解,采用基数排序最好。
  • 记录本身信息量较大时,为避免耗费大量时间移动记录,可用链表作为存储结构。
  • 记录本身信息量较大时,用简单选择排序较好。
  • 初始状态关键字基本有序,则用直接插入排序冒泡排序
  • 带排序的关键字随机分布,快速排序的平均时间最短。
  • 要求排序稳定且时间复杂度为
    ,则可用归并排序

注:此文为日常学习专业课的笔记,后期会不断的增删改一些部分,包括相关算法的代码实现等。如有错误,还望多多指出,谢谢🙏


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM