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