歸併排序和堆排序

2021-07-04 02:49:04 字數 1291 閱讀 8261

歸併排序的演算法我們通常用遞迴實現,先把待排序區間[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 ...