最大堆:每乙個結點都比其子結點大的二叉樹。
堆排序思想:把所有資料建成乙個最大堆,不停的把堆頂的元素取出來依次排列,取乙個數之後,剩下的數要維持最大堆結構
那麼堆排序主要分為
建成最大堆
維持堆結構
建最大堆 :時間複雜度為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 在陣列的非降序排序中,需要使用的就是大根...