内部排序算法小结

内部排序算法主要分为插入类排序、交换类排序和选择类排序,它们在性能上的差异主要体现在时间复杂度、空间复杂度和稳定性。各种排序算法都会进行元素间的比较和移动,时间复杂度主要由整个排序过程中的比较次数和移动次数决定。空间复杂度体现在除了待排序记录本身所占的空间,排序过程中占用了多少辅助空间。

1.插入类排序

直接插入排序

如果待排序记录之间是顺序排列,此时整个排序过程中元素比较的次数为n-1次,移动次数为0次。如果待排序记录之间是逆序排列,第i趟排序比较次数为i,移动的次数为i+1,其中i的范围是2到n。因此,整个排序过程中元素的比较次数为(n+2)(n-1)/2,移动次数为(n+4)(n-1)/2。

直接插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。从直接插入排序算法的实现可以发现,位置靠后的记录是不可能插入到相同大小的记录之前的,因此直接插入排序算法是稳定的。

折半插入排序

折半插入排序算法与直接插入排序算法相比,每趟的比较次数为log2^i,因此整体的比较次数为O(nlog2^n)。但是折半算法的移动次数较直接插入算法并未改变。

折半算法的时间复杂度仍然是O(n^2),空间复杂度为O(1)。从算法实现可以看出折半插入排序算法是稳定的。

希尔排序

希尔排序利用了当“待排序记录n较小,序列基本有序”时使用直接插入算法性能较好这一特点而改进。希尔排序算法的时间复杂度为O(n^1.5),空间复杂度为O(1),它是不稳定的排序算法。举反例如下:待排序序列为{2,4,1,(2)},设delta[1]=2,则一趟排序后序列为{1,(2),2,4}。

2.交换类排序

冒泡排序

当待排序记录逆序排列时,每趟冒泡算法进行i次比较和3i次交换(两个元素交换),i的范围是1到n-1。因此总的比较次数为n(n-1)/2,总的移动次数为3n(n-1)/2。冒泡排序算法的时间复杂度为O(n^2),空间复杂度O为(1),是一种稳定的排序算法。

快速排序

快速排序最好的情况是每次将待排序的记录都等分为二,此时时间复杂度为O(nlog2^n)。最坏情况下,待排序记录已经排好序,此时总共的比较次数为n(n-1)/2,此时时间复杂度为O(n^2)。

快速排序的平均复杂度为O(nlog2^n),空间复杂度为O(log2^n),它是一种不稳定的排序算法。举反例如下:待排序序列为{3,2,(2)},则一趟排序后记录为{(2),2,3}。

3.选择类排序

简单选择排序

无论待排序记录的初始排列如何,简单选择排序总的比较次数总为n(n-1)/2,因为它每趟比较的次数为n-i,i的范围从1到n-1。最好的情况下,简单选择排序算法的移动次数为0,最坏情况下移动的3(n-1)。

简单选择排序算法的时间复杂度为O(n^2),空间复杂度为O(1),它是不稳定的排序算法。举反例如下:待排序记录为{6,8,(6),2,7},一趟排序后记录为{2,8,(6),6,7},二趟排序后记录为{2,(6),8,6,7}。

堆排序

堆排序的时间复杂度为O(nlog2^n),空间复杂度为O(1),它是不稳定的排序算法。

4.归并排序

归并排序的时间复杂度为O(nlog2^n),空间复杂度为O(n),它是稳定的排序算法。

5.总结

综上所述,内部排序算法的时间复杂度、空间复杂度和稳定性总结如下表:

1.直接插入排序、折半插入排序、冒泡排序和简单选择排序合称为简单排序,它们的时间复杂度均为O(n^2),空间复杂度为O(1)。稳定性方面只有简单选择排序是不稳定的排序算法。简单排序只适合n较小的情况。

2.当待排序记录基本有序时,直接插入排序是最佳的排序算法。它常与快速排序和归并排序等结合使用,因为这些算法会将整个打排序记录划分为若干个子记录,这些子记录数量较小而且基本有序。

3.排序性能较好的有希尔排序、快速排序、堆排序和归并排序,除了希尔排序的时间复杂度为O(n^1.5),其他排序算法均为O(nlogn)。虽然快速排序最坏情况下时间性能下降为O(n^2),但是就平均性能而言快速排序算法是最好的。堆排序和归并排序的性能比较稳定,当n比较大时,归并排序的性能比堆排序要好,但是它需要的辅助空间却为O(n)。

4.所有的排序算法中,不稳定的算法有简单选择排序、希尔排序、快速排序和堆排序。性能较好的排序算法中只有归并排序是稳定的。排序是按记录的主关键字进行的,此时不用考虑排序方法的稳定性。如果排序是按记录的次关键字进行的, 则应充分考虑排序方法的稳定性。

原文地址:https://www.cnblogs.com/alantu2018/p/8482906.html

时间: 2024-08-08 06:44:50

内部排序算法小结的相关文章

常用排序算法小结

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 //the basic bubble sort 6 void maopao1(int *num,int len) 7 { 8 int i,j; 9 int temp; 10 for (i = 0; i < len-1; ++i) 11 { 12 for (j = i+1; j<len; ++j) 13 { 14 if (num[i]>num[j]) 15 { 16 t

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡.直接插入.简单选择.快速 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 1.直接插入排序 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入实现如下:

Java实现各种内部排序算法

数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成. 性能:时间复杂度:最好o(n):有序,最坏o(n^2):逆序,平均o(n^2):空间复杂度o(1):稳定 1 public int[] straightInsertSort(int array[]){ 2 int

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?     2.每个算法的稳定性怎样?时间复杂度是多少?     3.在什么情况下

常见排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?      2.每个算法的稳定性怎样?时间复杂度是多少?      3.在什么情

【转】排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?      2.每个算法的稳定性怎样?时间复杂度是多少?      3.在什么情