大家好,今天来为大家解答各种排序算法的时间复杂度这个问题的一些问题点,包括八种基本排序及其时间复杂度也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
本文目录
一、快速排序算法的时间复杂度是多少
1、快速排序的平均时间复杂度和最坏时间复杂度分别是O(nlgn)、O(n^2)。
2、当排序已经成为基本有序状态时,快速排序退化为O(n^2),一般情况下,排序为指数复杂度。
3、快速排序最差情况递归调用栈高度O(n),平均情况递归调用栈高度O(logn),而不管哪种情况栈的每一层处理时间都是O(n),所以,平均情况(更佳情况也是平均情况)的时间复杂度O(nlogn),最差情况的时间复杂度为O(n^2)。
4、快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序,它采用了一种分治的策略,通常称其为分治法。快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
5、(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
6、(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
7、(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
8、(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
二、所有排序算法的时间复杂度
1、首先将所有待排序的数字放入工作列表中。
2、从列表的之一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
3、重复2号步骤,直至再也不能交换。
4、冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。
5、设数组内存放了n个待排数字,数组下标从1开始,到n结束。
6、从数组的第i个元素开始到第n个元素,寻找最小的元素。
7、将上一步找到的最小元素和第i位元素交换。
8、如果i=n-1算法结束,否则回到第3步
9、选择排序的平均时间复杂度也是O(n^2)的。
三、各种算法的时间复杂度
1、 O(1)< O(logn)< O(n)< O(nlogn)< O(n^2)< O(n^3)< O(2^n)< O(n!)< O(n^n)
2、一般时间复杂度到了2 n(指数阶)及更大的时间复杂度,这样的算法我们基本上不会用了,太不实用了.比如递归实现的汉诺塔问题算法就是O(2 n).
3、平方阶(n^2)的算法是勉强能用,而nlogn及更小的时间复杂度算法那就是非常高效的算法了啊.
4、冒泡排序,简单选择排序,堆排序,直接插入排序,希尔排序的空间复杂度为O(1),因为需要一个临时变量来交换元素位置,(另外遍历序列时自然少不了用一个变量来做索引)
5、快速排序空间复杂度为logn(因为递归调用了),归并排序空间复杂是O(n),需要一个大小为n的临时数组.
6、基数排序的空间复杂是O(n),桶排序的空间复杂度不确定
7、原文:
四、常见排序算法以及对应的时间复杂度和空间复杂度
排序:将杂乱无章的数据,按照一定的 *** 进行排列的过程叫做排序。
排序大的分类可分为内排序和外排序,不需要访问外存就能进行排序的叫做内排序。
排序也可以分为稳定排序和不稳定排序
稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序 *** 是稳定的。即;若 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次,更高可执行到世界的尽头。。。
五、排序算法的时间复杂度是多少
1、算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
2、一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
3、在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!