导航:首页 > 源码编译 > 九种排序算法的时间复杂度

九种排序算法的时间复杂度

发布时间:2023-03-27 16:53:21

❶ 排序算法的时间复杂度

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。

一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。

而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

(1)九种排序算法的时间复杂度扩展阅读:

排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序算法进行归纳。

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。

内排序有可以分为以下几类:

(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。

(2)、选择排序:直接选择排序、堆排序。

(3)、交换排序:冒泡排序、快速排序。

(4)、归并排序

(5)、基数排序

❷ 常见排序算法以及对应的时间复杂度和空间复杂度

排序 :将杂乱无章的数据,按照一定的方法进行排列的过程叫做排序。

排序大的分类可分为 内排序 外排序 ,不需要访问外存就能进行排序的叫做内排序。

排序也可以分为 稳定排序 不稳定排序

稳定排序 :假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。即;若 a[i]=a[j] , a[i] a[j] 之前,经过排序后 a[i] 依然在 a[j] 之前。冒泡排序、直接插入排序、二分插入排序、归并排序,基数排序都是稳定排序。
不稳定排序 :直接选择排序、堆排序、快速排序、希尔排序,猴子排序。

以升序为例,比较相邻的元素,如果第一个比第二个大,则交换他们两个。如果两个元素一样大,则继续比较下一对。所以冒泡排序是一种稳定排序。

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。快速排序是不稳定排序。

将序列分为两个部分{{有序序列},{无序}},每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。如果碰到相等的元素,就会把它插入到想等元素后面,顺序不会改变,所以直接插入排序是稳定排序。

在直接插入排序的基础上,对有序序列进行划分。例如:序列为 {{a[0]......a[i-1]},a[i]} 其中 {a[0]......a[i-1]} 为有序序列,取 a[(i-1)/2] ,将其与 a[i] 比较,即可确定 a[i] 的范围 (a[0]...a[(i-1)/2] 或者 a[(i-1)/2]...a[i-1]) ,然后继续在已确定的范围内进行二分。范围依次缩小为: 1/2、1/4、1/8、1/16...... 可快速确定a[i]应该插入的位置。二分插入排序也是稳定排序。

将整个序列分割成若干个小的子序列,每个子序列内分别进行插入排序。一般情况下步长取n/2。直到最后一次步长为1,即所有元素在一个组中进行排序。由于希尔排序是先将整个序列划分为多个子序列进行排序,相同的元素顺序在这个过程中顺序可能会被打乱,所以希尔排序是不稳定排序。

从待排序的数据元素中,选出最小或最大的元素与序列第一个数交换。直到所有数据排完。直接选择排序是不稳定排序。例如: {3,3,1} ,第一次排序就将1和第一个3交换,想等元素的顺序改变了。

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

堆排序是一种树形选择排序,是对直接选择排序的有效改进。
最大堆:每个节点的值都大于等于它的孩子节点。
最小堆:每个节点的值都小于等于它的孩子节点。
最大堆第0个数据是最大数,最小堆第0个数据是最小数。
堆排序是不稳定排序

思想

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
如何将两个有序序列合并?(升序)
{a[0]......a[i-1]},{b[0]......b[j-1]}
b[0]<a[0] ,取 b[0] 放入数组 c 中,然后继续比较数组 a b 中的第一个元素,直到数组 a b 中最后一对元素比较完成。

思想

将数组分成二组 a , b 如果这二组组内的数据都是有序的,那么就可以按照上述方法对这二组数据进行排序。如果这二组数据是无序的?
可以将 a , b 组各自再分成二组。递归操作,直到每个小组只有一个数据,每个小组只有一个元素所以我们可以认为它已经是有序序列,然后进行合并。
先分解后合并。
归并排序是稳定排序

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。从最低位起从0-9依次扫描序列,一边扫描一边将扫描到的数据加到新的序列中,得到一个序列。然后比较高一位,重复上述操作,直到最高位排序完成。数列就变成一个有序序列。基数排序是稳定排序。

以全是二位数的序列举例

无限猴子定理 :指一只猴子随机在打字机键盘上按键,最后必然可以打出法国国家图书馆的每本图书。

时间复杂度最低1次,最高可执行到世界的尽头。。。

❸ 快速排序法的平均时间复杂度和最坏时间复杂度分别是多少

快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2)。

当排序已经成为基本有序状态时,快速排序退化为O(n^2),一般情况下,排序为指数复杂度。

快速排序最差情况递归调用栈高度O(n),平均情况递归调用栈高度O(logn),而不管哪种情况栈的每一层处理时间都是O(n),所以,平均情况(最佳情况也是平均情况)的时间复杂度O(nlogn),最差情况的时间复杂度为O(n^2)。



(3)九种排序算法的时间复杂度扩展阅读

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序,它采用了一种分治的策略,通常称其为分治法。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

❹ 各种排序法的时间复杂度到底多少

根据《算法导论(中文版)》P83表格以及《算法(中文版)》部分章节内容:

算法最坏情况运行时间平均情况

冒泡&&插入&&选择排序 n^2n^2

快速排序n^2 n*log n

希尔排序(希尔增量) n^2 n^(1.3 - 2)

堆排序 n*log n n*log n

注:希尔排序的性能依赖于选择的增量。

❺ 所有排序算法的时间复杂度

冒泡排序是这样实现的:

首先将所有待排序的数字放入工作列表中。

从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。

重复2号步骤,直至再也不能交换。

冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。

选择排序

选择排序是这样实现的:

设数组内存放了n个待排数字,数组下标从1开始,到n结束。

i=1

从数组的第i个元素开始到第n个元素,寻找最小的元素。

将上一步找到的最小元素和第i位元素交换。

如果i=n-1算法结束,否则回到第3步

选择排序的平均时间复杂度也是O(n^2)的。

❻ 几种排序的时间复杂度排序

从时间复杂度看,所有内部排序方法可以分为两类。
1.插入排序 选择排序 起泡排序
其时间复杂度为O(n2);
2.堆排序 快速排序 归并排序
其时间复杂度为O(nlog2n)。
这是就平均情况而言的,如果从最好的情况考虑,
则插入排序和起泡排序的时间复杂度最好,为O(n),
而其他算法的最好情况同平均情况大致相同。
如果从最坏的情况考虑,快速排序的时间复杂度为O(n2),插入排序和起泡排序虽然同平均情况相同,但系数大约增加一倍,运行速度降低一半,而选择排序、堆排序和归并排序则影响不大。

❼ C语言 各常见排序法的时间复杂度 急 请简单说明

选择排序算法复杂度是O(n^2)。
插入排序是O(n^2)
快速排序快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n^2)。
堆排序算法时间复杂度O(nlogn)。
归并排序的时间复杂度是O(nlog2n)。

❽ 排序算法的时间复杂度是多少

排序算法的时间复杂度是T(n)。

算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

性质:

一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。

❾ 常见的排序算法以及时间复杂度

在常见的排序算法中,冒泡排序,选择排序和直接插入排序都是O(N平方)的。快速排序,归并排序,2叉排序树排序。都是O(NLogN)的。小学生排序则是O(N)的。

❿ 求各种查找和排序的时间复杂度

冒泡排序是稳定的,算法时间复杂度是O(n ^2)。

2.2 选择排序(Selection Sort)

选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。

选择排序是不稳定的,算法复杂度是O(n ^2 )。

2.3 插入排序 (Insertion Sort)

插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i] 又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。

直接插入排序是稳定的,算法时间复杂度是O(n ^2) 。

2.4 堆排序

堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

堆排序是不稳定的,算法时间复杂度O(nlog n)。

2.5 归并排序

设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。

其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlog2n)。

2.6 快速排序

快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各判山数都比它小,右边晌冲圆各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

快速排序是不稳定的,最理宴塌想情况算法时间复杂度O(nlog2n),最坏O(n ^2)。

2.7 希尔排序

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

希尔排序是不稳定的,其时间复杂度为O(n ^2)。

排序类别
时间复杂度
空间复杂度
稳定

1
插入排序
O(n2)
1


2
希尔排序
O(n2)
1
×

3
冒泡排序
O(n2)
1


4
选择排序
O(n2)
1
×

5
快速排序
O(Nlogn)
O(logn)
×

6
堆排序
O(Nlogn)
1
×

7
归并排序
O(Nlogn)
O(n)

阅读全文

与九种排序算法的时间复杂度相关的资料

热点内容
程序员东北大学 浏览:424
编译忽略空字符 浏览:117
多店铺阿里云服务器教程 浏览:378
单片机求初值 浏览:420
安卓机如何在电脑备份图片 浏览:925
ca证书加密机价格 浏览:798
天干地支年份算法 浏览:796
程序员打造的视频 浏览:7
java和php通信 浏览:680
为什么黑程序员 浏览:163
程序员男生 浏览:456
戴尔文件夹内文件怎么置顶 浏览:582
云服务器6m网速 浏览:722
vivo手机中国联通服务器地址 浏览:862
工程总控编译失败 浏览:707
燕赵红枫app如何下载 浏览:867
php查杀软件 浏览:878
教育管理学pdf 浏览:547
服务器均衡怎么使用 浏览:626
linux中jps 浏览:954