排序圖表:
一、插入排序
每次將乙個待排序的資料,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部資料插入完成。
二、希爾排序
先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的資料進行直接插入排序,因此可以形象的稱希爾排序為「跳著插」
三、氣泡排序
通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就「沉」到最後面了。重複n次即可以使陣列有序。
氣泡排序改進1:在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷是否要繼續迴圈。
氣泡排序改進2:記錄某次遍歷時最後發生資料交換的位置,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。
四、快速排序
「挖坑填數+分治法」,首先令i =l; j = r; 將a[i]挖出形成第乙個坑,稱a[i]為基準數。然後j–由後向前找比基準數小的數,找到後挖出此數填入前乙個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前乙個坑a[j]中。重複進行這種「挖坑填數」直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將陣列分成二部分再分別重複上述步驟就完成了排序。
五、選擇排序
陣列分成有序區和無序區,初始時整個陣列都是無序區,然後每次從無序區選乙個最小的元素直接放到有序區的最後,直到整個陣列變有序區。
六、堆排序
圖:
堆的插入就是——每次插入都是將新資料放在陣列最後,而從這個新資料的父結點到根結點必定是乙個有序的數列,因此只要將這個新資料插入到這個有序數列中即可。
堆的刪除就是——堆的刪除就是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最小的,如果父結點比這個最小的子結點還**明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點開始將乙個資料在有序數列中進行「下沉」。
因此,堆的插入和刪除非常類似直接插入排序,只不是在二叉樹上進行插入過程。所以可以將堆排序形容為「樹上插」
七、歸併排序
歸併排序主要分為兩步:分數列(divide),每次把數列一分為二,然後分到只有兩個元素的小數列;合數列(merge),合併兩個已經內部有序的子串行,直至所有數字有序。用遞迴可以實現。
八、基數排序(桶排序)
基數排序,第一步根據數字的個位分配到每個桶裡,在桶內部排序,然後將數字再輸出(串起來);然後根據十位分桶,繼續排序,再串起來。直至所有位被比較完,所有數字已經有序。
輔助空間
對n個記錄的檔案進行快速排序,所需要的輔助儲存空間大致為 o(1
og2n
)o(1og2n)
o(1og2
n)所有的簡單排序方法(包括:直接插入、起泡和簡單選擇)和堆排序的空間複雜度為o(1);
快速排序為o(l
ogn)
o(logn )
o(logn
),為棧所需的輔助空間;
歸併排序所需輔助空間最多,其空間複雜度為o(n
)o(n )
o(n)
;鏈式基數排序需附設佇列首尾指標,則空間複雜度為o(r
d)o(rd )
o(rd)。
謝謝!!!(^ — ^)
排序演算法各個演算法介紹
一 基本排序演算法 1 氣泡排序 假如我們現在按身高公升序排隊,一種排隊的方法是 從第一名開始,讓兩人相互比身高,若前者高則交換位置,更高的那個在與剩下的人比,這樣一趟下來之後最高的人就站到了隊尾。接著重複以上過程,直到最矮的人站在了佇列首部。我們把隊頭看作水底,隊尾看作水面,那麼第一趟比較下來,最...
各個排序演算法的時間複雜度和穩定性總結
排序圖表 一 插入排序 每次將乙個待排序的資料,跟前面已經有序的序列的數字一一比較找到自己合適的位置,插入到序列中,直到全部資料插入完成。二 希爾排序 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...