前面已經介紹了基礎的插入排序、選擇排序和氣泡排序,以及高效的希爾排序,看這裡。下面介紹剩餘的部分。
堆排序使用了選擇排序固有的方法,採用找最大元素的方法,從陣列末尾開始放置:將數組建堆,堆的根節點數值最大,將其放在陣列末尾,然後排除掉這個已在最合適位置的元素,重新建堆,根節點代表的最大元素放到陣列的倒數第二個位置,以此類推。**實現:
templatevoid heapsort(t data,int size)
}
其中,movedown函式,將根元素沿樹向下移動直至找到合適的位置,滿足(最大)堆的定義:1)每個節點的值大於等於其每個子節點的值;2)該樹完全平衡,最後一層的葉字都處於最左側的位置。實現**:
templatevoid movedown(t data, int first, int last)
return;
}else if(0==end-start) //陣列只乙個元素不需要排序
return;
else
}
其中的merge函式實現:
templatvoid merge(t data,int start,int end,t result){
int left_length=(end-start+1)/2+1;
int left_index=start;
int right_index=start+left_length;
int result_index=start;
while(left_index時間複雜度:最好o(n log(n)),最差o(n log(n)),平均o(n log(n))
生活中應用基數排序的案例:圖書館卡片排序,根據字母表中的字母將卡片分為很多堆,每一堆包含了姓名以相同字母開頭的作者,然後在每堆中根據作者姓名的第二個字母劃分堆,這個過程一直進行下去直到劃分出的堆數等於最長的作者姓名的字母個數為止。對整數排序時可以是從右往左的順序進行,建立0-9共10個堆,剛開始時所有整數都按照自己最右邊的數放入相應的堆裡面,比如18放在8堆裡,然後合併堆,再看所有整數的倒數第二個數字,18放在1堆裡,直到最長整數的最左邊數字處理完,注意上述的過程需要保持整數的相對位置(使用佇列),不然前面的過程實現按低位放置將毫無意義。**實現:
void radixsort(long data,int n){
register int d,j,k,factor;
const int radix=10;
const int digits=10; //陣列中整數的最大位數
queuequeues[radix];
//從右往左按數字儲存
for(d=0,factor=1;d時間複雜度:最好o(n k),最差o(n k),平均o(n k)
至此,常見的幾個常規的和高效的排序演算法介紹完畢,而stl裡的提供了常用的幾個排序實現,比如sort()函式實現了快速排序,stable_sort()實現了歸併排序。
《資料結構與演算法分析(c描述》 快速排序
快速排序是最快的已知排序演算法,平均執行時間為 o nlogn 最壞情況的效能為 o n 2 將陣列 s 快速排序由下列簡單的四步組成 如果 s 中元素個素是0或1,則返回 取 s 中任一元素作為樞紐元 將 s s 中其餘元素 分成兩個不相交的集合,s1 中元素小於 v,s2 中元素大於 v 對 s...
資料結構與演算法分析 隨筆2
includeusing namespace std n的二進位制數中1的個數 n是奇數的話,它等於n 2的二進位制表示中的1的個數加1 int ones int n return 1 int main size t size sizeof a sizeof int vectorvec a,a si...
資料結構與演算法簡記 排序演算法 2 線性排序
桶排序 將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序 桶內使用歸併排序保證穩定性 再把每個桶裡的資料按照順序依次取出 計數排序 獲取資料項大小範圍,設定 範圍大小 1 個桶,n個桶只代表0 n 1個數字,分別對值為每個桶代表的數字的資料項計數,放入對應桶,再對桶順序求和放入桶,最後...