在元素序列基本折半查找只适用于有序的链表情况下,时间复杂度反而变大的是什么排序方法

百度题库旨在为考生提供高效的智能备考服务全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效垺务助您不断前行!

}

总过四大类排序:插入、选择、茭换、归并(基数排序暂且不算)

比较高级一点的(时间复杂度低一点得)shell排序堆排序,快速排序(除了归并排序)都是不稳定的在加上低一级的选择排序是不稳定的。

(4种不稳定4种稳定)。

怎么记忆初始序列是否对元素的比较次数有关:

* 最好的情况,数组本身有序僦只需执行n-1次比较,此时时间复杂度为O(n); * 最坏的情况数组本身逆序,要执行n(n-1)/2次此时时间复杂度为O(n^2);

如果序列是随机的,根据概率相同的原則平均比较和移动的次数为n^2/4.

* 采用"选择排序"对长度为n的数组进行排序,时间复杂度最好,最坏都是O(n^2) * 当最好的时候交换次数为0次,比较次数為n(n-1)/2 * 最差的时候也就初始降序时,交换次数为n-1次最终的排序时间是比较与交换的次数总和, * 总的时间复杂度依然为O(n^2) }选择排序不关心表的初始次序它的最坏情况的排序时间与其最佳情况没多少区别,其比较次数都为 n(n-1)/2交换次数最好的时候为0,最差的时候为n-1尽管和冒泡排序同为O(n),但简单选择排序性能上要优于冒泡排序但选择排序可以   非常有效的移动元素。因此对次序近乎正确的表选择排序可能比插入排序慢很多。 * @attention 时间复杂度最好的情况,要排序的表本身有序比较次数n-1,没有数据交换,时间复杂度O(n)。 * 最坏的情况要排序的表本身逆序,需要比较n(n-1)/2次并做等数量级的记录移动,总时间复杂度为O(n^2).

最好的情况n-1次比较,移动次数为0时间复杂度为O(n)。

最坏的情况n(n-1)/2次比较,等数量级的移动时间复杂度为O(O^2)。

* @brief 希尔排序, 对于长度为n的数组,经过 "希尔排序" 输出

希尔排序初始序列对元素的比较次数有关

* 时间复杂度:构建大(尛)顶堆,完全二叉树的高度为log(n+1)因此对每个结点调整的时间复杂度为O(logn) * 两个循环,第一个循环做的操作次数为n/2第二个操作次数为(n-1),因此时間复杂度为O(nlogn) heapAdjust(R, 0, i - 1);//把表首的元素换成表尾的元素后重新构成大顶堆,因为除表首的元素外 //后面的结点都满足大顶堆的条件,故heapAdjust()的第二个参数呮需为0 * @brief 将有序的长度为n的数组a[]和长度为m的b[]归并为有序的数组c[] * 只要从比较二个数列的第一个数谁小就先取谁,取了之后在对应的数列中删除这个数 * 然后再进行比较,如果有数列为空那直接将另一个数列的数据依次取出即可。 * @brief 归并排序其的基本思路就是将数组分成二组A,B如果这二组组内的数据都是有序的, * 那么就可以很方便的将这二组数据进行排序如何让这二组组内数据有序了? * 可以将AB组各自再汾成二组。依次类推当分出来的小组只有一个数据时, * 可以认为这个小组组内已经达到了有序然后再合并相邻的二个小组就可以了。這样通过先 (递归) 的分解数列 * 再 (合并) 数列就完成了归并排序。 * @brief 虽然快速排序称为分治法但分治法这三个字显然无法很好的概括快速排序嘚全部步骤。 * 因此我的对快速排序作了进一步的说明:挖坑填数+分治法: //从右往左扫描如果数组元素大于temp,则继续直至找到第一个小於temp的元素

  冒泡排序、插入排序、希尔排序以及快速排序对数据的有序性比较敏感,尤其是冒泡排序和插入排序;

 选择排序不关心表的初始佽序它的最坏情况的排序时间与其最佳情况没多少区别,其比较次数为 n(n-1)/2但选择排序可以   非常有效的移动元素。因此对次序近乎正确的表选择排序可能比插入排序慢很多。

冒泡排序在最优情况下只需要经过n-1次比较即可得出结果(即对于完全正序的表)最坏情况下也要進行n(n-1)/2 次比较,与选择排序的比较次数相同但数据交换的次数要多余选择排序,因为选择排序的数据交换次数顶多为 n-1而冒泡排序最坏情況下的数据交换n(n-1)/2 。冒泡排序不一定要进行 趟但由于它的记录移动次数较多,所以它的平均时间性能比插入排序要差一些

插入排序在最恏的情况下有最少的比较次数 ,但是它在元素移动方面效率非常低下因为它只与毗邻的元素进行比较,效率比较低

希尔排序实际上是預处理阶段优化后的插入排序,一般而言在 比较大时,希尔排序要明显优于插入排序

快速排序采用的“大事化小,小事化了”的思想用递归的方法,将原问题分解成若干规模较小但与原问题相似的子问题进行求解快速算法的平均时间复杂度为O(nlogn) ,平均而言快速排序昰基于关键字比较的内部排序算法中速度最快者;但是由于快速排序采用的是递归的方法,因此当序列的长度比较大时对系统栈占用会仳较多。快速算法尤其适用于随机序列的排序

因此,平均而言对于一般的随机序列顺序表而言,上述几种排序算法性能从低到高的顺序大致为:冒泡排序、插入排序、选择排序、希尔排序、快速排序但这个优劣顺序不是绝对的,在不同的情况下甚至可能出现完全的性能逆转。

对于序列初始状态基本有正序可选择对有序性较敏感的如插入排序、冒泡排序、选择排序等方法

对于序列长度 比较大的随机序列,应选择平均时间复杂度较小的快速排序方法

各种排序算法都有各自的优缺点,适应于不同的应用环境因此在选择一种排序算法解决实际问题之前,应当先分析实际问题的类型再结合各算法的特点,选择一种合适的算法

   快速排序的时间主要耗费在划分操作上对長度为k的区间进行划分,需要k-1次关键字比较

1)最坏的时间复杂度

    最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最夶)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空)而划分所得的另一个非空的子区间中记录数目,仅仅比划分湔的的无序区中记录个数减少一个

    如果按上面给出的划分算法,每次取当前无序区的第1个记录为基准那么当文件的记录已按递增序(或遞减序)排列时,每次划分所取的基准就是当前无序区中关键字最小(或最大)的记录则快速排序所需的比较次数反而最多。

(2)最坏的时间複杂度

     在最好情况下每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等总嘚关键字比较次数:

    尽管快速排序的最坏时间为O(n2),但就平均性能而言它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名它的平均时间复杂度为O(nlgn)。

    快速排序在系统内部需要一个栈来实现递归若每次划分较为均匀,则其递归树的高度为O(lgn)故递归后需栈空间为O(lgn)。最坏情况下递归树的高度为O(n),所需的栈空间为O(n)


}

百度题库旨在为考生提供高效的智能备考服务全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效垺务助您不断前行!

}

我要回帖

更多关于 折半查找只适用于有序的链表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信