在軟體設計相關領域,「堆(heap)」的概念主要涉及到兩個方面:
一種是資料結構,邏輯上是一顆完全二叉樹,儲存上是乙個陣列物件(二叉堆)。
另一種是垃圾收集儲存區,是軟體系統可以程式設計的記憶體區域。
堆排序的時間複雜度是
堆排序
堆排序是一種選擇排序。是不穩定的排序方法。時間複雜度為o(nlog2n)。
堆排序的特點是:在排序過程中,將排序陣列看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的記錄。
基本思想
1.將要排序的陣列建立為乙個大根堆。大根堆的堆頂元素就是這個堆中最大的元素。
2.將大根堆的堆頂元素和無序區最後乙個元素交換,並將無序區最後乙個位置例入有序區,然後將新的無序區調整為大根堆。
重複操作,無序區在遞減,有序區在遞增。
初始時,整個陣列為無序區,第一次交換後無序區減一,有序區增一。
每一次交換,都是大根堆的堆頂元素插入有序區,所以有序區保持是有序的。
大根堆和小根堆
堆:是一顆完全二叉樹。
大根堆:所有節點的子節點比其自身小的堆
小根堆:所有節點的子節點比其自身大的堆
堆與陣列的關係
堆是一種邏輯結構(形象的表示資料的儲存格式),陣列則是資料的實際儲存結構(對應資料的儲存位址),堆中的根節點與左右子節點在儲存陣列中的位置關係如下:假設根節點在陣列中的位置(陣列下標)為 i ,那麼左節點在陣列中的位置(陣列下標)為 i * 2 + 1 , 右節點在陣列中的位置(陣列下標)為 i * 2 + 2 。
以上是基本的知識點,具體**如下所示:
//private
static
void
heapsortfunction(
int array)
}catch
(exception ex)
}///
///建立大頂推(根節點大於左右子節點)
//////
待排陣列
private
static
void
buildmaxheap(
int array)
}catch
(exception ex)
}///
///大頂推的調整過程
//////
待調整的陣列
///待調整元素在陣列中的位置(即:根節點)
///堆中所有元素的個數
private
static
void
maxheapify(
int array,
intcurrentindex,
intheapsize)
if(right
<
heapsize
&&array[right]
>
array[large])
//與右子節點進行比較
if(currentindex
!=large)
//如果 currentindex != large 則表明 large 發生變化(即:左右子節點中有大於根節點的情況)
}catch
(exception ex)
}///
///交換函式
//////
元素a///
元素bprivate
static
void
swap(
refint
a, ref
intb)
堆排序演算法實現
include define true 1 define false 0 typedef struct recordtype void sift recordtype r,int k,int m 調整堆 r i t void crt heap recordtype r,int length 建立堆 ...
排序演算法 堆排序 C
堆排序的基本過程 1.找到最大的元素,放到最後面去 2.找到第二大的元素,放在倒數第二個位置 依次類推,直到所有元素完成排序。其中每一步中,找最大元素的方法是借助堆。堆可以看成是乙個完全二叉樹,且每個節點的值都大於它的子節點的值。對於陣列來說,就是任意第 i 個元素大於第 2i 1 和第 2i 2 ...
排序演算法 堆排序(c
堆排序思想 首先將待排序的記錄序列構造成乙個堆,然後將堆頂元素移走,此時,選出了堆中所有記錄的最大者即堆頂。並將剩餘的記錄再調整為堆,這樣又找出了次大的元素,以此類推,直到堆中只有乙個記錄為止。a.將無序序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆 b.將堆頂元素與末尾元素交換,將最大元素...