手寫堆排序和歸併排序

2022-04-28 21:24:18 字數 940 閱讀 2589

/*

* 手動實現堆排序, 使用大根堆實現 從小到大排序 */

//完成在陣列[low, high]的範圍內,對在位置low上的節點向下進行調整

void shift(int nums, int low, int

high)

else

break

; }

nums[i] =tmp;

}void heap_sort(int nums, int

n)

//進行n-1次迴圈, 完成堆排序, 把堆頂元素放到後面

for(int i=n; i>=2; i--)

}int

main()

//進行堆排序

heap_sort(nums, n);

//列印排序後的陣列

for(int i=1; i<=n; i++)

return0;

}

/*

* 實現二路歸併排序 */

//合併函式:原陣列、輔助陣列、開始下標,中間下標、結束下標

void merge(int sourcearray, int temparray, int s, int mid, int

t)

while(i<=mid)

temparray[k++] = sourcearray[i++];

while(j<=t)

temparray[k++] = sourcearray[j++];

for(i=s; i<=t; i++)

sourcearray[i] =temparray[i];}//

原陣列,輔助陣列,開始下標,結束下標

void mergesort(int sourcearray,int temparray,int s,int

t)}

歸併排序和堆排序

歸併排序的演算法我們通常用遞迴實現,先把待排序區間 s,t 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間 s,t 桶排序法,非常耗空間。規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶的個數,要求待排序陣...

堆排序和歸併排序

極少涉及,在此就不再研究 了!堆排序 原理 把待排序的元素按照大小在二叉樹位置上排列,排序好的元素要滿足 父節點的元素要大於等於子節點 這個過程叫做堆化過程,如果根節點存放的是最大的數,則叫做大根堆,如果是最小的數,則叫做小根堆,可以把根節點拿出來,然後再堆化,迴圈到最後乙個節點。時間複雜度 平均 ...

堆排序,歸併排序

1.介紹 對簡單的選擇排序的一種改進,改進效果非常明顯,每次在選擇最小記錄的同時,並根據比較結果對其他記錄做出相應的調整,那麼排序效率就會提高很多。定義 將待排序的序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將它移走 其實就是將其與堆陣列的末尾元素進行交換,此時末尾元素就是最大值 ...