堆排序演算法詳解

2021-08-30 09:05:36 字數 1272 閱讀 5936

最大堆:每乙個結點都比其子結點大的二叉樹。

堆排序思想:把所有資料建成乙個最大堆,不停的把堆頂的元素取出來依次排列,取乙個數之後,剩下的數要維持最大堆結構

那麼堆排序主要分為

建成最大堆

維持堆結構

建最大堆 :時間複雜度為o(n)

注意:在使用陣列表示的堆結構中,結點arr[index]的父結點為arr[(index - 1) / 2].

建堆思想: 把陣列中的每乙個數遍歷一次,如果它比父結點要大就與父結點交換,知道它小於等於父結點

//arr:所有資料所在陣列  index:當前處理的數下標

//因為(0 - 1) / 2 = 0所以不會越界

void buildheap(int arr, int index)

}

維持堆的結構:時間複雜度log(n),每一次維持堆為log(n)

注意:乙個結點arr[index]的左孩子為arr[index * 2 + 1],右孩子為arr[index * 2 + 2]

維持堆結構思想:從arr[0]開始,選取它和它的左右孩子中最大的那個,如果最大的是自己,不是左右孩子,結束;如果最大的是左右孩子中的乙個,將其與父結點交換位置;重複上述過程。

**如下:

//curindex:當前處理的數的下標  heapsize:目前堆的大小

//leftchild: 當前數的左孩子

//largestindex:當前數與其左右孩子中最大的數的下標

void heapify(int arr, int curindex, int heapsize)

swap(arr[largestindex], arr[curindex]);

curindex = largestindex;

leftchild = curindex * 2 + 1;

}}

堆排序主函式如下

void heapsort(int arr, int heapsize) 

swap(arr[0], arr[--heapsize]);

while (heapsize)

}

排序演算法 詳解堆排序演算法

1 原理 堆排序是一種選擇排序,通過實現大小堆,來取出堆頂的資料,然後和最後乙個交換,然後將堆的大小減一,迴圈這個過程直到,只有乙個資料時停止。公升序建大堆,降序建小堆。2 問題 很多人會疑惑為什麼要交換之後再減小堆的大小呢?難道不交換就不能篩選出我們要的極值嗎?首先向下調整演算法的時間複雜度為o ...

C 堆排序演算法例項詳解

堆中元素的排列方式分為兩種 max heap或min heap,前者每個節點的key都大於等於孩子節點的key,後者每個節點的key都小於等於孩子節點的key。由於堆可以看成乙個完全二叉樹,可以使用連續空間的a來模擬完全二叉樹,簡單原始的實現如下 include int heapsize 0 全域性...

排序詳解 堆排序

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...