排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。
常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。
其中關於時間複雜度、穩定性等對比如下圖:
當n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。
快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
(1)直接插入排序:一般插入排序,比較是從有序序列的最後乙個元素開始,如果比它大則直接插入在其後面,否則一直往前比。如果找到乙個和插入元素相等的,那麼就插入到這個相等元素的後面。插入排序是穩定的。
(2)希爾排序:希爾排序是按照不同步長對元素進行插入排序,一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,穩定性就會被破壞,所以希爾排序不穩定。
(3)簡單選擇排序:在一趟選擇,如果當前元素比乙個元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。光說可能有點模糊,來看個小例項:858410,第一遍掃瞄,第1個元素8會和4交換,那麼原序列中2個8的相對前後順序和原序列不一致了,所以選擇排序不穩定。
(4)堆排序:堆排序的過程是從第n/2開始和其子節點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當然不會破壞穩定性。但當為n/2-1, n/2-2, …這些父節點擊擇元素時,有可能第n/2個父節點交換把後面乙個元素交換過去了,而第n/2-1個父節點把後面乙個相同的元素沒有交換,所以堆排序並不穩定。
(5)氣泡排序:由前面的內容可知,氣泡排序是相鄰的兩個元素比較,交換也發生在這兩個元素之間,如果兩個元素相等,不用交換。所以氣泡排序穩定。
(6)快速排序:在中樞元素和序列中乙個元素交換的時候,很有可能把前面的元素的穩定性打亂。還是看乙個小例項:6 4 4 5 4 7 8 9,第一趟排序,中樞元素6和第三個4交換就會把元素4的原序列破壞,所以快速排序不穩定。
(7)歸併排序:在分解的子列中,有1個或2個元素時,1個元素不會交換,2個元素如果大小相等也不會交換。在序列合併的過程中,如果兩個當前元素相等時,我們把處在前面的序列的元素儲存在結果序列的前面,所以,歸併排序也是穩定的。
(8)基數排序:是按照低位先排序,然後收集;再按照高位排序,然後再收集;依次類推,直到最高位。有時候有些屬性是有優先順序順序的,先按低優先順序排序,再按高優先順序排序,最後的次序就是高優先順序高的在前,高優先順序相同的低優先順序高的在前。基數排序基於分別排序,分別收集,所以是穩定的。
#include
//直接插入
void insertsort(int a,int n)
a[j]=temp;}}
}//希爾排序
void shellsort(int a,int n,int k)
a[j]=temp;}}
}//選擇排序
selectsort(int a,int n)
}}//氣泡排序
bubblesort(int a,int n)}}
}//歸併
void merge(int *a,int m,int *b,int n)
else
}else
else}}
for(i=0;i//歸併排序
mergesort(int a,int n)
}//快速排序
void quicklysort(int a,int l,int r)
//基數排序.求出第k+1位的數值
int pos(int n,int k)
//基數排序
void radixsort(int a,int n)
for(m=0;m<3;m++)
k=0;
for(i=0;ifor(j=1;j0]+1;j++)
radix[i][0]=0;}}
}void main();
int n=7,i,j;
//insertsort(a,n);
//mergesort(a,n);
//selectsort(a,n);
//shellsort(a,n);
//quicklysort(a,0,n-1);
for(j=5;j>0;j=j/2)
printf("\n");}}
八大排序演算法
1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length void shell ...
八大排序演算法
一 概述 八大排序演算法包括 1 插入排序之直接插入排序 straight insertion sort 2 插入排序之希爾排序 shells sort 3 選擇排序之簡單選擇排序 selection sort 4 選擇排序之堆排序 heap sort 5 交換排序之氣泡排序 bubble sort...
八大排序演算法
排序的定義 輸入 n個數 a1,a2,a3,an 輸出 n個數的排列 a1 a2 a3 an 使得a1 a2 a3 an in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序...