• 排序(Sort)知识点归纳


    目录

    1.基本概念

    两种基本操作:

    三种待排序存储方式

    2.插入排序

    直接插入排序

    1.时间复杂度

    2.空间复杂度

    3.算法稳定性

     希尔排序

    注意:

    3.交换排序

    冒泡排序(Bubble Sort)

    原理:

    时间复杂度:

    快速排序:

    算法描述

    平均时间复杂度O(nlog n)

    缺点:不稳定

    4.选择排序

    直接选择排序

    【概述】

    【排序过程】

    堆排序

    算法描述

    5.归并排序

    6.分配排序

    箱排序:

    基数排序:取多次关键字排序

    7.内部排序方法比较


    1.基本概念

    按给定的关键字递增/递减的次序排列

    两种基本操作:

    • 比较两个关键字大小
    • 改变指向记录的指针或移动记录本身

    三种待排序存储方式

    • 顺序存储
    • 链式存储
    • 辅助表形式

    2.插入排序

    直接插入排序

    1.时间复杂度

    最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n ) 
    最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O(n^2)

    综上,因此直接插入排序的平均时间复杂度为 O(n^2)

    2.空间复杂度

    辅助空间是常量
    平均的空间复杂度为:O (1)

    3.算法稳定性

    相同元素的前后顺序是否改变

    直接插入排序是稳定的

     希尔排序

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

    希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止

    注意:

    最后一个增量必须是1 !!!

    3.交换排序

    冒泡排序(Bubble Sort)

    原理:

    每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。

    而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。


    代码

    1. //冒泡排序两两比较的元素是没有被排序过的元素--->
    2. public void bubbleSort(int[] array){
    3. for(int i=0;i1;i++){//控制比较轮次,一共 n-1 趟
    4. for(int j=0;j1-i;j++){//控制两个挨着的元素进行比较
    5. if(array[j] > array[j+1]){
    6. int temp = array[j];
    7. array[j] = array[j+1];
    8. array[j+1] = temp;
    9. }
    10. }
    11. }
    12. }

    时间复杂度:

    时间复杂度为 O(n^2)

    快速排序:

    算法描述

    快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。执行如下操作:

    从数列中挑出一个元素,称为 “基准”(pivot);
    重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
    递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
     

    平均时间复杂度O(nlog n)

    缺点:不稳定

    4.选择排序

    直接选择排序

    【概述】

    直接选择排序又称简单选择排序,是一种不稳定的排序方法,其是选择排序中最简单一种,其基本思想是:第 i 趟排序再待排序序列 a[i]~a[n] 中选取关键码最小的记录,并和第 i 个记录交换作为有序序列的第 i 个记录。

    其实现利用双重循环,外层 i 控制当前序列最小值存放的数组元素位置,内层循环 j 控制从 i+1 到 n 序列中选择最小的元素所在位置 k

    【排序过程】

    1.排序过程
    具体的排序过程为:

    将整个记录序列划分为有序区和无序区,初始时有序区为空,无序区含有待排序的所有记录
    在无序区选择关键码最小的记录,将其与无序区中的第一个元,使得有序区扩展一个记录,同时无序区减少了一个记录
    不断重复步骤 2,直到无序区只剩下一个记录为止
    2.实例
     初始关键字:『 8,5,2,6,9,3,1,4,0,7 』

     第一趟排序后:0,『5,2,6,9,3,1,4,8,7』

     第二趟排序后:0,1,『2,6,9,3,5,4,8,7』

     第三趟排序后:0,1,2,『6,9,3,5,4,8,7』

     第四趟排序后:0,1,2,3,『9,6,5,4,8,7』

     第五趟排序后:0,1,2,3,4,『65,9,8,7』

     第六趟排序后:0,1,2,3,4,5,『6,9,8,7

     第七趟排序后:0,1,2,3,4,5,6,『9,8,7

     第八趟排序后:0,1,2,3,4,5,6,7,『89

     第九趟排序后:0,1,2,3,4,5,6,7,8,『9

     结果:          『 0,1,2,3,4,5,6,7,8,9 』
    ————————————————
    版权声明:本文为CSDN博主「Alex_McAvoy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u011815404/article/details/79256237

    堆排序

    堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

    算法描述

    将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
    将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
    由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
     

    5.归并排序

    6.分配排序

    箱排序:

    箱排序也称桶排序(Bucket Sort),其基本思想是:设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1],把关键字等于k的记录全都装入到第k个箱子里(分配),然后按序号依次将各非空的箱子首尾连接起来(收集)。

    适用于:

    关键字取值范围小

    基数排序:取多次关键字排序

    利用分配和收集两种基本操作。基数排序是一种按记录关键字的各位值逐步进行排序的方法。此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。

    7.内部排序方法比较

     

     

  • 相关阅读:
    git 生成公钥
    使用Windbg过程中两个使用细节分享
    2023年【陕西省安全员B证】考试报名及陕西省安全员B证模拟试题
    Hadoop生态及Hive、HBase、Impala、HDFS之间的关系
    企业上半年净利润下降近8成,企业如何应对?
    提升企业网络安全的重要性:EventLog Analyzer的角色
    付费版 VS Code?脑瓜子嗡嗡的吧!
    【C++】STL详解(十)—— 用红黑树封装map和set
    Java程序员:三个月刷完1000道面试真题,没想到老板直接给我升职了
    AUTOCAD——LEN命令
  • 原文地址:https://blog.csdn.net/clover_oreo/article/details/126340631