首先,與初始狀態無關分為幾種情況
1、算法復雜度與初始狀態無關;
2、元素總比較次數與初始狀態無關;
3、元素總移動次數與初始狀態無關。
【其實還有一種就是總排序趟數與初始狀態無關,由於分析簡單,除了快速排序的排序次數(遞歸深度)與關鍵字選擇(初始狀態)有關,還有一個優化后的冒泡排序和后序是否有序有關,其他均只與總長度n有關,與初始狀態無關,故不做分析】
首先看內排序總結表:

由表中紅線標出的地方可以輕易得出以下四種排序方法的算法復雜度與數組的初試狀態無關:
一堆(堆排序)烏龜(歸並排序)選(選擇排序)基(基數排序)友(摘自牛友 sunlight_run)
我是這么記的:兩個選擇排序和兩個復雜排序(選擇、插入、交換我列為簡單排序)。
稍加判斷得到,以上三種情況2、3是必定包含在情況1中間的。
所以接下來分別列舉這四個個算法討論比較次數以及移動次數(以升序排序為例,不贅述代碼)。
【最近很忙,沒時間畫圖,用文字總結的,嘿嘿,就將就看吧,等今年冬天有時間了再添幾個圖~~】
- 堆排序
思想:首先對初始數組建立最小堆,然后取堆頂元素與堆尾交換,再此堆元素(不含堆尾)再重新構建最小堆,依次循環。
分析:由於建立最小堆其實就是將初始元素按照規定的准則進行一系列排序(包括層級向下比較、交換),所以如果元素一開始就已經是最小堆則不需要此時的交換且大大減少向下比較次數,
所以堆排序不屬於情況二也不屬於情況三。
- 歸並排序
思想:將初試數組划分成N個子數組,兩兩進行合並排序,然后結果再和其他同級合並后的數組合並知道合並完所有。
分析:外層遞歸與初始無關,主要思考合並排序中的比較和交換即可。合並排序思想:將數組A第一個與數組B第一個比較,較小的那一個直接進入result數組並且指針向下移動再與對面數組第一個比較,依次類推,然后將還有剩余的數組內元素全放入result,最后用result將原數組中對應的值一一替換。因此,假設初始數組就是有序的,那么每次合並排序的時的比較次數都僅僅是一個待合並的數組的長度,因此比較次數與初始狀態有關,歸並排序不屬於情況二。
然而,不論一開始的狀態如何,最后都是兩個數組進入result,移動次數都為兩個待合並數組的長度和,然后再將result內元素全部移動到原來數組進行替換。所以元素移動次數與初始狀態無關,歸並排序屬於情況三。
- 選擇排序
思想:i 從頭開始,每次遍歷之后所有的元素,k 從 i 開始,向后標記最小的元素,循環后如果大於 i ,則與 i 位置元素交換,一直到最后。
分析:比較次數都是N-1的階乘,與初始狀態無關,所以選擇排序屬於情況二。
交換次數當全部已經排序好時則不發生交換,所以選擇排序不屬於情況三。
- 基數排序
思想:將數組從低位到高位,每到一位對應分入10個桶(0-9)中,依次到最高位,由於每上升一位,處於“0號桶”中的數據都會將此位之前的數字排好,以此達到排序效果。
分析:基數排序中並不發生任何元素之間的比較,所以基數排序屬於情況二。
不論初始數組如何排列,都是從個位開始,各自進入自己個位對應的位置,之后也都是一樣,所以元素移動次數一樣,所以基數排序屬於情況三。
綜上所述:
1、算法復雜度與初始狀態無關的有:選擇排序、堆排序、歸並排序、基數排序。
2、元素總比較次數與初始狀態無關的有:選擇排序、基數排序。
3、元素總移動次數與初始狀態無關的有:歸並排序、基數排序。
歡迎討論。
