歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。
桶排序法,非常耗空間。規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶的個數,要求待排序陣列中沒有重複的元素。
但是,桶排序並不是 比較排序,不受時間複雜度 o(n log n) 下限的影響。
關於排序演算法的時間複雜度和穩定性請見該博文:
演算法由c++實現的**如下,已經在 vs2010上測試通過:
//對 0 ~ n-1 排序, len = n
//桶排序,將排序後陣列返回
int* bucketsort(int arr, int len)
return resutlarr;
}//歸併排序,將arr矩陣拆成兩部分,並分別比較
//temparr臨時儲存比較結果
void mergearray(int arr, int startpoint, int endpoint, int temparr)
while(i <= midpoint)//第二種情況
temparr[k++] = arr[i++];
while(j <= endpoint)//第三種情況
temparr[k++] = arr[j++];
//每次合併後,需要將結果賦值給原陣列
for(int i = endpoint; i >= startpoint; i--)
arr[i] = temparr[--k];
}void mergesort(int arr, int startpoint, int endpoint)//歸併排序
deletetemparr;//要釋放資源
}int _tmain(int argc, _tchar* argv)
; int len = sizeof(arr) / sizeof(arr[0]);
mergesort(arr, 0, len - 1);
for(int i = 0; i < len; i++)
cout
<" ";
cout
/* int* resultarr;
resultarr = bucketsort(arr, len);
for(int i = 0; i < len; i++)
cout0;}
排序後,陣列元素按照從小到大順序依次輸出,由於陣列元素已經明確給出,則不再給出排序結果截圖。 堆排序和歸併排序
極少涉及,在此就不再研究 了!堆排序 原理 把待排序的元素按照大小在二叉樹位置上排列,排序好的元素要滿足 父節點的元素要大於等於子節點 這個過程叫做堆化過程,如果根節點存放的是最大的數,則叫做大根堆,如果是最小的數,則叫做小根堆,可以把根節點拿出來,然後再堆化,迴圈到最後乙個節點。時間複雜度 平均 ...
堆排序,歸併排序
1.介紹 對簡單的選擇排序的一種改進,改進效果非常明顯,每次在選擇最小記錄的同時,並根據比較結果對其他記錄做出相應的調整,那麼排序效率就會提高很多。定義 將待排序的序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將它移走 其實就是將其與堆陣列的末尾元素進行交換,此時末尾元素就是最大值 ...
手寫堆排序和歸併排序
手動實現堆排序,使用大根堆實現 從小到大排序 完成在陣列 low,high 的範圍內,對在位置low上的節點向下進行調整 void shift int nums,int low,int high else break nums i tmp void heap sort int nums,int n ...