經典排序演算法之堆排序

2021-09-10 17:16:43 字數 2013 閱讀 2604

堆排序是一種選擇排序,是不穩定的排序方法。

特點:

在排序過程中,將排序陣列看成是一棵完全二叉樹儲存結構,利用完全二叉樹中父節點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大(最小)的記錄。

基本思想:

堆分大根堆和小根堆,大根堆是父節點比所有子節點都大,小根堆是父節點比所有子節點都小。下面以大根堆為例。

1、先將初始檔案r[1..n]建成乙個大根堆,此堆為初始的無序區。

2、再將關鍵字最大的的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys <= r[n].key。

3、由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys <= r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。

**:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace test1

;

heapsortfunction(arr);

foreach (var item in arr)

#endregion

}public static void heapsortfunction(int array)

}catch (exception ex)

}////// 建立大頂推(根節點大於左右子節點)

//////待排陣列

private static void buildmaxheap(int array)

}catch (exception ex)

}////// 大頂推的調整過程

//////待調整的陣列

///待調整元素在陣列中的位置(即:根節點)

///堆中所有元素的個數

private static void maxheapify(int array, int currentindex, int heapsize)

if (right < heapsize && array[right] > array[large]) //與右子節點進行比較

if (currentindex != large) //如果 currentindex != large 則表明 large 發生變化(即:左右子節點中有大於根節點的情況)

}catch (exception ex)

}////// 交換函式

//////元素a

///元素b

private static void swap(ref int a, ref int b)}}

執行結果:

時間複雜度:初始化建堆的時間複雜度為o(n),排序重建堆的時間複雜度為nlog(n),所以總的時間複雜度為o(n + nlogn) = o(nlogn)。在序列初始狀態為堆的情況下比較次數顯著減少,在序列有序或逆序的情況下比較次數不會發生明顯變化。所以時間複雜度為:o(nlogn);

演算法的穩定性:是不穩定的排序演算法。

演算法適用的場合:堆排序比較交換次數比快速排序多,所以平均而言比快速排序慢,那麼絕大多數場合都應該使用快速排序而不是堆排序。

①、但是在取最大(小)優先順序的元素,其時間複雜度為o(1)。

②、插入新的元素,過程相當於插入堆尾,然後進行堆調整。

經典排序演算法之堆排序

經典排序演算法之堆排序 若以公升序排序說明,把陣列轉換成最大堆積 max heap heap 這是一種滿足最大堆積性質 max heap property 的二叉樹 對於除了根之外的每個節點i,a parent i a i 重複從最大堆積取出數值最大的結點 把根結點和最後乙個結點交換,把交換後的最後...

經典演算法之堆排序

author s email wardseptember gmail.com date 2017.12.5 堆排序 堆是一種資料結構,可以把堆看成一棵完全二叉樹,這棵樹滿足 任何乙個非葉子 結點的值都不大於 或不小於 其左右孩子結點的值。若父親大 孩子小,則這樣的堆 叫做大頂推 若父親小 孩子大,則...

經典演算法之堆排序

以堆的方式去排序,使最大值位於根節點,之後就縮小尺寸,調整位置。時間複雜度o n logn 不是很穩定 1.建立乙個堆 2.把堆首最大值和堆尾互換位置 3.縮小堆尺寸,調整位置 4.重複 直至堆尺寸為1 private int heapsort int source return arr priva...