日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


一、排序算法說明

  • 排序的定義:對一個無序的序列進行排序的過程。
    輸入:n個數:a1,a2,a3,…,an。
    輸出:n個數的排列:a1,a2,a3,…,an,使得a1<=a2<=a3<=…<=an。
  • 排序的穩定性:相同值的節點相對位置是否會發生改變。
    穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
    不穩定:如果a原本在b的前面,而a=b,排序之后a可能會出現在b的后面。
  • 排序的時間復雜度:一個算法執行所耗費的時間,一般在三種情況下考慮:最好情況、最壞情況、平均情況。
  • 空間復雜度:運行完一個程序所需內存的大小。
  • 二、各種排序算法性能分析

    1. 插入排序1.1 直接插入排序
    直接插入排序的原理是將未排好序的序列一個個地插入到已排好序的序列中,插入時,需要與已排好序的序列進行多次比較,直到找到合適的位置插入,而原來已排好序的部分節點可能需要進行后移操作,這個過程中需要一個額外的空間保存一個值用于交換節點,所以空間復雜度為O(1)。

    時間復雜度
    最壞情況:當待排序序列正好為逆序狀態,首先遍歷整個序列,之后一個個地將待插入元素放在已排序的序列最前面,之后的所有元素都需要向后移動一位,所以比較和移動的時間復雜度都是O(n),再加上遍歷整個序列的復雜度,總復雜度為O(n^2)。
    最好情況:當待排序序列正好為正序狀態,則遍歷完整個序列,當插入元素時,只比較一次就夠了,所以時間復雜度為O(n)。
    平均情況:當被插入的元素放在已排序的序列中間位置時,為平均情況,比較和移動的時間復雜度為O(n/2),所以總的時間復雜度依然為O(n^2)。

    穩定性
    插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩定的。

    1.2 希爾排序
    希爾排序是對直接插入排序的優化,它的原理是加大插入排序中元素的間隔,并在這些有間隔的元素中進行插入排序,從而使數據進行大幅度的移動,當進行過依次排序后,再減小間隔再一次進行插入排序,直到間隔縮小為1。這樣做的目的可以使得最后排序時整個序列基本有序,而無需再進行過多的元素比較和移動次數,在這個過程中也只需要一個額外的空間保存一個值用于交換節點,所以空間復雜度為O(1)。

    時間復雜度與增量的選取有關,計算起來較為復雜,不再細述。

    穩定性
    希爾排序是進行多次直接插入排序的算法,由于多次插入排序,雖然每一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最后其穩定性就會被打亂,所以希爾排序是不穩定的。

    2. 選擇排序2.1 直接選擇排序
    直接選擇排序的原理是在待排序的序列中選取最小(大)的值放在序列的第一個位置。遍歷整個序列,首先選取第一位置的值分別與之后所有的值比較,如果后邊值更小則與之交換,直到第一輪遍歷結束時,序列第一個位置的值就是最小的,接下來繼續從第二個、第三個做同樣的操作,此過程需要一個額外的空間保存最小值用于交換,所以空間復雜度為O(1)。

    時間復雜度
    序列無論是正序還是逆序狀態,每一輪的最小值需要比較到最后才能確定,所以最壞情況和最好情況下都需要 比較n次,再加上遍歷整個序列的O(n),總的復雜度為O(n^2),平均情況的復雜度也是O(n^2)。

    穩定性
    直接選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那么,在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素后面,那么交換后穩定性就被破壞了。舉個例子,序列5 8 5 2 9, 第一遍選擇時第1個元素5會和2交換,那么原序列中2個5的相對前后順序就被破壞了,所以選擇排序不是一個穩定的排序算法。

    2.2 堆排序
    堆排序是對直接選擇排序的改進算法,選擇排序的特點在于每次選取最小或最大的值,而選取最大值時的比較次數為復雜度的關鍵,堆排序采用二叉樹的方法存儲元素,每個節點都滿足父節點的值大于等于子節點的特點,與直接選擇排序類似,堆排序需要兩個個值的空間來存儲臨時變量,用于交換節點,一次用于存儲子樹最大節點用于交換子節點,一次用于存儲堆頂的值用于交換最后的節點,所以空間復雜度為O(1)。

    采用堆的方式尋找最大值是降低時間復雜度的關鍵,假設有n個數據,需要n-1次建堆的過程,每次建堆的時間復雜度為log2n,但是無論序列的開始狀態如何,都需要對堆進行遍歷尋找最大值,所以在最好情況、最壞情況和平均情況下的時間復雜度都是O(nlog2n)。

    穩定性
    堆排序是利用堆的特點,堆的結構是節點i的孩子為2*i和2*i+1節點,大頂堆要求父節點大于等于其2個子節點,小頂堆要求父節點小于等于其2個子節點。在一個長為n 的序列,堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n /2-1, n/2-2, …1這些個父節點選擇元素時,就會破壞穩定性。有可能第n/2個父節點交換把后面一個元素交換過去了,而第n/2-1個父節點把后面一個相同的元素沒有交換,那么這2個相同的元素之間的穩定性就被破壞了。所以,堆排序不是一個穩定的排序算法。

    3. 交換排序3.1 冒泡排序
    冒泡排序是交換類排序算法的典型實現,它的原理是遍歷整個序列,比較前后相鄰兩個值的大小,如果前邊比后邊大,則交換它們,直到序列的最后的兩個值進行比較,這樣最后的值就是最大的,之后再進行第二輪、第三輪遍歷,直到剩下序列的最前的值。從實現原理上可以知道,冒泡排序只需要一個值的空間用于交換節點,所以空間復雜度為O(1)。

    時間復雜度
    最壞情況:序列為逆序狀態,則每一輪遍歷都需要n次交換位置,所以時間復雜度為O(n^2)。
    最好情況:序列為正序狀態,每一輪遍歷不需要交換位置,所以時間復雜度為O(n)。
    平均情況:每一輪遍歷需要n/2次交換位置,所以時間復雜度依然為O(n^2)。

    穩定性
    冒泡排序就是把小的元素往前調或者把大的元素往后調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,不會發生交換。如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來,也不會發生交換,所以相同元素的前后順序并沒有改 變,所以冒泡排序是一種穩定排序算法。

    3.2 快速排序
    快速排序是另一種交換類排序方法,它的原理是選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。首先就地快速排序使用的空間是O(1)的,而真正消耗空間的就是遞歸調用了,因為每次遞歸就要保持一些數據,每一次都平分數組的情況下空間復雜度為O(logn) ,最差的情況下空間復雜度為O(n)。

    時間復雜度
    最壞情況:每一次選取的基準元素都是最大或最小的,復雜度為O(n^2)
    最好情況:每一次選取的基準元素都能平分整個序列,由于快排涉及到遞歸調用,所以時間復雜度為O(nlog2n)。
    平均情況:平均情況下復雜度也是O(nlog2n)。穩定性
    快速排序有兩個方向,左邊的i下標一直往右走,當a[i]<=a[center_index],其中center_index是中樞元素的數組下標,一般取為數組第0個元素。而右邊的j下標一直往左走,當a[j]>a[center_index]。如果i和j都走不動了,i<=j, 交換a[i]和a[j],重復上面的過程,直到i>j。 交換a[j]和a[center_index],完成一趟快速排序。在中樞元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,比如序列為 5 3 3 4 3 8 9 10 11,現在中樞元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序算法,不穩定發生在中樞元素和a[j] 交換的時刻。

    4. 歸并排序
    歸并排序先遞歸的把數組劃分為兩個子數組,一直遞歸到數組中只有一個元素,然后再調用函數把兩個子數組排好序,因為該函數在遞歸劃分數組時會被壓入棧,所以這個函數真正的作用是對兩個有序的子數組進行排序。排序函數的步驟,讓兩個數組的元素進行比較,把大的/小的元素存放到臨時數組中,如果有一個數組的元素被取光了,那就直接把另一數組的元素放到臨時數組中,然后把臨時數組中的元素都復制到實際的數組中。所以 歸并的空間復雜度就是那個臨時的數組和遞歸時壓入棧的數據占用的空間n + logn,所以空間復雜度為:O(n)。

    時間復雜度
    歸并排序的時間主要花在了劃分序列和合并序列上,由于是采用遞歸的方式進行合并,所以與快速排序類似,樹的每層元元素的個數最多是n,也就代表著每層最多進行n次比較,而遞歸樹最多只有log2n層,而且不管元素在什么情況下都要做這些步驟,所以該算法的最優時間復雜度和最差時間復雜度及平均時間復雜度都是一樣,都是O( nlogn )。

    穩定性
    歸并排序的原理是把序列遞歸地分成短序列,遞歸出口是短序列只有1個元素(認為直接有序)或者2個序列(1次比較和交換),然后把各個有序的段序列合并成一個有序的長序列,不斷合并直到原序列全部排好序??梢园l現,在1個或2個元素時,1個元素不會交換,2個元素如果大小相等也不會交換,所以不會破壞穩定性。而在短的有序序列合并的過程中,穩定性也沒有受到破壞,合并過程中可以保證如果兩個當前元素相等時,把處在前面的序列的元素保存在結果序列的前面,這樣就保證了穩定性。所以,歸并排序是穩定的排序算法。

    三、各種排序算法性能總結

    參考

    排序算法之性能分析及總結_Blog-CSDN博客?blog.csdn.net超詳細的八大排序算法的各項比較以及各自的特點_柯南的博客-CSDN博客?blog.csdn.net

    總結

    以上是生活随笔為你收集整理的冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。