筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。
一、為什麼要研究排序問題
許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點:
l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序
l很多演算法將排序作為關鍵子程式
l現在已經有很多排序演算法,它們採用各種技術
l排序時乙個可以證明其非平凡下界的問題,並可以利用排序問題的下界證明其他問題的下界
l在實現排序演算法是很多任務程問題即浮出水面
二、排序問題的形式化定義
輸入:由
n個數組成的乙個序列
1,a2,
……,an>
輸出:對輸入序列的乙個排列(重排)
1』,a2』,
……,an』>,
使得a1』
≤a2』
≤……≤
an』
【說明】在實際中,待排序的數很少是孤立的值,它們通常是成為激勵的資料集的乙個部分,每個記錄有乙個關鍵字
key,
是待排序的值,其他資料位衛星資料,它們通常以
key為中心傳遞。 三、
相關概念
1.排序的穩定性:
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。
a.穩定排序:
插入排序
、氣泡排序、雞尾酒排序、計數排序、
合併交換排序
、歸併排序、基數排序、桶排序、鴿巢排序
b.不穩定排序:選擇排序、堆排序、希爾排序、快速排序
2.內部、外部排序:在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內、外存交換,則稱之為內部排序
(簡稱內排序
);反之,若排序過程中要進行資料的內、外存交換,則稱之為外部排序。
3.待排檔案的常用儲存方式:
a.順序表:
對記錄本身進行物理重排(即通過關鍵字之間的比較判定,將記錄移到合適的位置
b.鍊錶:
無須移動記錄,僅需修改指標
c.用順序的方式儲存待排序的記錄,但同時建立乙個輔助表:對輔助表的表目進行物理重排(即只移動輔助表的表目,而不移動記錄本身)。
4.影響排序效果的因素
a.待排序的記錄數目nb.
記錄的大小(規模
)c.關鍵字的結構及其初始狀態
d.對穩定性的要求
e.語言工具的條件
f.儲存結構
g.時間和輔助空間複雜度等
四、排序演算法的分類(內部排序)
1.比較類排序:排序結果中各元素的次序基於輸入元素間的比較
a.比較排序演算法的下界
比較排序可以被抽象為決策樹。一棵決策樹是一棵滿二叉樹,表示某排序演算法作用於給定輸入所做的所有比較,而忽略控制結構和資料移動。
在決策樹中,對每個節點都註明i,
j(1≤
i,j≤
n),對每個葉節點都註明排列
<
π(1),
π(2),
……,
π(n)>
。排序演算法的執行對應於遍歷一條從根到葉節點的路徑。在每個內節點作比較ai≤
aj,其左子樹決定ai≤
aj之後的比較,其右子樹決定ai>
aj之後的比較。當到達乙個葉節點時排序演算法就已經確定了順序。要使排序演算法能正確的工作,其必要條件是
n個元素的
n!種排列都要作為決策樹的乙個葉節點出現。在決策樹中,從根到任意乙個可達葉節點之間最長路徑的長度(決策樹的高度)表示對應的排序演算法中最壞情況下的比較次數。對於一棵高度為
h,具有
l個可達葉節點的決策樹有
n! ≤l≤
2h,則有h≥
lg(n!)=
ω(nlgn) b.
常見的比較類排序
a)選擇類排序:選擇排序、堆排序
b)插入類排序:插入排序、二叉插入、兩路插入、希爾排序
c)交換類排序:氣泡排序、雞尾酒排序、合併交換排序、快速排序
d)歸併排序
2.非比較類排序:
計數排序、
基數排序、
桶排序、
鴿巢排序
五、常用的排序演算法 1.
比較類排序
a.選擇類排序
a)選擇排序(
selection sort
)——原地排序、不穩定排序
【思路】
首先找出
a中最小元素,並將其與
a[0]
中元素交換;接著找出
a中次最小元素,並將其與
a[1]
中元素交換;對a中頭
n-1個元素繼續這一過程
【**】
【時間複雜度分析】選擇排序的比較操作為
n(n − 1) / 2
次,交換操作介於0和
n(n − 1) / 2
次之間,故其時間複雜度為θ
(n2) b)
堆排序(
heap sort
)六、**
【二叉堆】(二叉)堆資料結構是一種陣列物件,可以被視為一棵完全二叉樹。二叉堆有兩種:大頂堆和小頂堆(最大堆和最小堆)。大頂堆中每個節點的值不大於其父節點的值,這樣,堆中最大的元素就存放在根節點中。
【思路】首先將輸入陣列構造成大頂堆;由於陣列中最大元素為
a[0]
,將其與
a[n]
交換使其達到最終正確位置;在堆中除去
a[n]
,並將a[1…n]
保持為大頂堆;重複上述過程,直到堆大小降為2。
【**】由思路知堆排序中應包含構造大頂堆和保持大頂堆子程式。
maxheapify
方法被用來保持大頂堆,其時間複雜度為
o(lgn)
buildmaxheap
方法被用來構造大頂堆,其時間複雜度為
o(n)
堆排序**如下:
【時間複雜度分析】呼叫
buildmaxheap
時間為o(n)
,n-1
次呼叫maxheapify
,每次時間為
o(lgn)
,故堆排序時間複雜度為
o(nlgn)
常用排序演算法
一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...
常用排序演算法
排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...
常用排序演算法
每次從尚未排好的陣列範圍裡選出乙個最小的放到正確的位置。void selection sort int array,int size swap array,lhs,min 從陣列裡選出乙個基準元素,通過交換位置讓它前面的元素都比它小 後面的元素都比它大,最後分而治之。void quicksort i...