TAOCP之排序演算法(一)

2021-08-29 17:54:05 字數 1827 閱讀 9926

這一段時間都在看taocp的排序演算法,這些都是我大學生活裡面很想看卻沒看到的部分,同時也為了鞏固實踐,把它們都寫出程式來了。供自己複習之用,也希望能與網友分享。如果有什麼問題,還請各位網友能夠指正出來。

一、計數排序(位於taocp第三卷中的內部排序前面的內容中,是高德納先生講的第一種型別的排序方法,其適應面比較窄,但卻是很有效。同時可以證明此演算法是穩定的)

//a陣列儲存輸入資料,count陣列用來計數

for(

inti=0

; i1; i

++)  

else

}        }//

b陣列用於儲存排序後的資料

for(

inti=0

; i<

n; i

++) 

如果說上面的程式屬於「比較計數」[引自taocp]的話,那麼還有一種方法就是「分布計數」[引自taocp]了。

for(

inti=0

; i<

n; i

++) 

for(

inti

=u; i

<

v; i

++) 

for(

inti=n

-1; i>=

0; i

--) 

需要注意的是,在「分布計數」中的count與「比較計數」中的count的計數方式有一點點不同,所以在最終轉換成排序後的陣列時也有不同的處理。而且,在「分布計數」中,要求各個記錄的鍵碼值最好滿足一定的分布條件[u,v],全都在乙個比較整齊的區間內。也可以證明,此排序演算法是穩定的,主要就是在構成排序陣列b時採用的迴圈是倒序,如果是順序的話,那就不同了。

二、比較排序(這也是taocp書中講的第一類排序方法,也是各類資料結構或演算法教材必須涉及到的一類演算法,過多的解釋就無需展開了,讓我們來直接用程式對話。)

for(

inti=1

; i<

n; i

++) 

a[j+1] 

=r;}上面這個是順序表的直接插入方法,針對於2~n的各個記錄,用直接尋找最佳位置的方式來進行排序,尋找過程可以和移動過程(順序表獨有)結合起來,以節省時間。在這種方式下,其實最好採用表方式進行儲存。在taocp一書中還提到,如果結合二叉插入或「兩路」插入的方法,可以進一步節省時間,但是其實質上還是會得不到最終的改善。

inth[4] 

=;       

//shell排序每步步長 

for(

intih=0

; ih

<

4; ih

++) 

a[j+

h[ih]] =r;

}}結合多步長跳躍方式和直接插入方法,就構成了shell排序方法,也叫做「減少增量的排序」[引自taocp]。選擇乙個較好的增量序列來作為步長,在上述程式中就是h陣列,優點是對直接插入方法會有實質性的改進。

intt =n

-1;  //

已經排好序的最低元素下標-1 

inttemp;

ints;

while

(t !=0) 

}}上面這個程式是氣泡排序方法,在taocp書中講是第二類排序演算法,通過「交換」或「換位」方法來實現。在程式中,t變數是相當於選擇最後(假設每一次都是把大元素往後移動)還要排序元素的下標,因此對於t以後的元素就無須再去比較和考察了。因此,氣泡排序也可稱為「交換選擇」或「擴散」等。

因為看書的進度比較慢,這些程式就是我先根據演算法原理實現了的。後續還有很多排序和查詢演算法,我還要進一步學習。同時,有關這些演算法的優缺點和分析需要做進一步**,歡迎各位網友能與多一起學習這等重要基礎性知識。我的郵箱位址是:[email protected]

排序演算法之氣泡排序(一)

氣泡排序是最常使用的一種排序演算法,演算法思想是從頭到尾遍歷陣列,將相鄰的兩個值進行比較,小的放在前面,大的放在後面。這樣第一趟排序之後,最後乙個位置所放的元素就是最大的值,第二趟排序之後,倒數第二個元素也排好了。經過n次排序之後,所有的值就排序完成了。比如無序陣列 3,1,4,2,5 第一躺 1,...

演算法鋪子之排序 快速排序(一)

快速排序是20世紀世界上最偉大的演算法之一,顧名思義,這個演算法能很快的對資料進行排序。而且在很多庫的底層 中也經常使用快速排序來實現排序的功能,比如jdk,stl等。以公升序為例。首先會找乙個元素v作為基準,然後將整個待排序序列parttion成3個區域a,b和c。其中a區域為全部比v小的元素,b...

演算法鋪子之排序 堆排序(一)

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...