堆排序很有意思。作為排序演算法來講,它和快速排序都是o(nlogn)的時間複雜度,都是就地排序,都是採用遞迴。兩者差不多,既生瑜,何生亮?不過堆是一種很有用的資料結構,通過堆排序演算法,可以學習堆這種資料結構,以後可能用得上。
堆排序演算法思路很簡單:
第一步,構建乙個堆;
第二步,取出堆頂;
第三步,如果排序沒完成,重複第一步。
堆分為最大堆和最小堆,表示堆的頂點元素是整個序列的最大值還是最小值。通常堆用陣列來儲存,陣列的第乙個元素表示堆頂。
堆排序**如下:
void heapsort (int array, int inum) // inum表示陣列元素個數
if (inum <= 1) // 防禦性**
return;
buildmaxheap (array, inum); // 建立最大堆
for (int i=inum-1; i>0; i--) // 從陣列尾部開始遍歷,不斷取出堆頂元素,放到陣列尾端,並重新建立堆
int itemp =array[i]; // 取出陣列尾部元素,並與堆頂元素交換。
array[i] = array[0]; //此時堆頂元素是最大元素(最大堆),已經被放在了合適的位置上——陣列尾部,陣列元素期望由小到大排列
array[0] = itemp; // 原陣列尾部元素被臨時放到堆頂
maxheapfy (0, i); // 調整陣列元素,使之滿足堆的條件
看起來很簡單,只不過兩個關鍵的函式沒說,乙個是堆調整函式maxheapfy,乙個是建堆函式buildmaxheap。其實建堆函式也用到了堆調整函式。好,下文就說。
重新上本科 快速排序 下
在我的印象中,絕大多數的教科書講解快速排序的時候,都用嚴蔚敏書中的方法,採用左右兩個迭代指示器,從兩個方向進行遍歷比較。能不能只從乙個方向進行遍歷,遍歷一遍就能完成交換任務呢?演算法導論 提供了一種方法。演算法導論 是從左到右遍歷,設定兩個指示器 從這個角度來說本質上與嚴蔚敏的方法一致 乙個指示器指...
重新上本科 排序 除錯環境
上面列了幾個排序演算法的 這些 都是經過debug,程式驗證過的。我順便也把驗證的環境貼出來吧。很多東西,其實是寫給自己看的。一 隨機數生成程式,生成一定數量的隨機數,用於排序,結果記錄在檔案中。bool generatenum const char sfileout,int icount if i...
重新上本科 快速排序 中
直接看一下嚴蔚敏的 資料結構 他是這麼處理的 他利用了錨值位置上的值,參與到交換過程之中。演算法的過程變為 首先,右迭代指示器從右向左遍歷,找到第乙個比錨值小的數值的位置,並將錨值 預設是陣列第乙個元素 與當前位置的數值相交換 此時,右迭代指示器停止,迭代器指向的位置作為臨時變數,存放錨值,該位置向...