堆排序演算法(C 實現)

2022-02-17 20:01:56 字數 1887 閱讀 1609

在軟體設計相關領域,「堆(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.將堆頂元素與末尾元素交換,將最大元素...