排序演算法

文章推薦指數: 80 %
投票人數:10人

插入排序法(insertion sort). 說明:它的用途是將數字插入已排序的數列中。

輸入:n個資料的陣列A. 輸出:A陣列中的資料依一定的次序排列. 演算法:.   想想看,如果我們的電話簿不是依照姓名的筆劃數排列,而是雜亂無章隨便編排的話,當我們要尋找某個人的姓名時,是不是就要花費較多的時間,因此,當我們想要在大量的資料中尋找某一筆資料時,我們會把這些資料先做排序,而後再依據排序的規則來做搜尋,如電話簿即是一例,它就依姓名筆劃來排序,因此我們想找尋某一人電話時,只要算一算筆劃,很快地,就可以找到這個人的電話了。

例:有一陣列A存放的資料為〔27,7,2,9,4,85〕,試將此陣列由小而大排列。

交換排序法(exchangesort) 選擇排序法(selectionsort) 插入排序法(insertionsort) 合併排序法(mergesort)  快速排序法(Quicksort)  演算法的比較          交換排序法(exchangesort) 說明: (1)拿第一個數與其他數做比較,只要數字比第一個小,則兩數交換,那麼,當全部的數都比過之後,最小數即找出,且放在第一個位置。

(2)重覆(1)的步驟,但由第2個開始比較起,直至此陣列達到已排序狀態。

(3)交換的次數較多。

(4)適用於未排序的狀況。

輸入:n個資料的陣列A 輸出:A陣列中的資料依一定的次序排列 演算法:  privateSub Form_Activate()  DimA(n)AsInteger  DimnAsInteger  DimIAsInteger  DimJAsInteger  For I=1ton-1  For J:=1ton  If A[J]0andA[j]>x  A[J+1]=A[j]  J=J-1  Loop  A[l+1]=x  NextI  EndSub 圖解: top 合併排序法(mergesort) 說明: (1)將數列分成(divide)兩個子數列,每一個數列擁有n/2個數字。

(2)排列每一個子數列,除非此子數列夠小(只剩一個數字),否則再繼續重覆(1)。

(3)結合(merge)每一個子數列使之成為單一數列。

輸入:n個資料的陣列A 輸出:A陣列中的資料依一定的次序排列 演算法:  privateSub MergeSort()  DimA(n)AsInteger  DimnAsInteger  Consth=n\2  Constm=n-h  DimX(h)AsInteger  DimY(m)AsInteger  Ifn>1then  CopyA[I]throughA[h]toX  CopyA[h+I]throughA[n]toY  Mergesort(h,X)  Mergesort(m,Y)  Merge(h,m,X,Y,A)  EndIf  EndSub 圖解: top 快速排序法(Quicksort) 說明: (1)先找一個指標(為求方便,通常是第一個數),將,數列中大於這個指標的數,都放在右邊,反之則放在左邊。

(2)和合併排序法相似,但快速排序法的優點是比較節省空間。

輸入:n個資料的陣列A 輸出:A陣列中的資料依一定的次序排列 演算法:  privateSub Quick_Sort()  DimA(n)AsInteger  DimnAsInteger  DimhighAsInteger  DimlowAsInteger  DimpivotAsInteger  If high>lowthen  Partition(low,high,pivot)  Quick_Sort(low,pivot-1)  Quick_Sort(piovt+1,high)  EndIf  EndSub 實例: top 演算法的比較 排序法名稱 優點 缺點 Exchange   交換次數很多 Insertion 適用於數列較小的情況 最耗時間 Merge 運作的時間最快 須要額外的空間來處理 Quick 運作的時間最快 須要額外空間來處理,但沒有MergeSort須要的空間多。

觀賞時請按滑鼠左鍵,可單獨觀賞或連續按下  氣泡排序法  (BubbleSort)  雙向氣泡排序法 (Bi-DirectionalBubbleSort) 快速排序法 (QuickSort)     演算法並沒有所謂的好與壞,而是視你要解決的問題來選擇較適用的演算法,且各種演算法可搭配使用,亦可自己想出一套更快更有效率的演算法。

top



請為這篇文章評分?