首先,與初始狀態無關分為幾種情況
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、元素總比較次數與初始狀態無關的有:選擇排序、基數排序。
4、元素總移動次數與初始狀態無關的有:歸併排序、基數排序。
關於C C 中的關鍵字delete
這個問題迷惑著我,我在csdn上發帖子,得到了很好的解決。這是我第一次在csdn上發帖子,csdn果然是n多大牛.先看 問題是為什麼執行delete這條語句會導致虛構函式無限遞迴?感謝arcticanimal,他給出了明確的兩點解釋 1 delete 操作符會被編譯器展開為至少兩個子過程 1.呼叫所...
關於C 中的explicit關鍵字
explicit,和建構函式一起使用.explicit constructor指明建構函式只能顯示使用,目的是為了防止不必要的隱式轉化.舉個例子 有這樣一段 class a int test const a 乙個應用函式 test 2 正確 過程是這樣的 編譯器知道傳的值是int而函式需要的是a型別...
關於C 中的explicit關鍵字
關於c 中的explicit關鍵字 在c 中,explicit關鍵字是用來修飾類的建構函式的。含有被該關鍵字修飾過的建構函式的類,將不能進行隱式型別轉換,型別轉換只能顯式進行。並且需要注意的是該關鍵字僅用於類內的建構函式的宣告上。例如 include class ball ball int x 0,...