1、基本思路
1)最大堆(堆可以視為一棵完全二叉樹)滿足性質:根節點的值大於子節點。依據這一性質可以將陣列重新排成一種最大堆(在樹中從上到下從左到右依次為陣列的各個元素)。
2)最大堆中,根節點的值總是該堆中最大的值,應此也是這個子陣列的最大值,排序成功後其必然在子陣列的末尾位置。交換最大堆得根節點和尾節點,除去這個元素之後的子陣列也可以構成最大堆。迭代此過程這可以獲得陣列的最終排序。
偽**:
heapsort(a)
build-max-heap(a)
for i=length[a] downto 2
exchange a[1],a[i]
heap-size[a] = heap-size[a] - 1
max-heapify(a,1)
build-max-heap(a)
heap-size[a] = length[a]
for i=floor(length[a]/2) downto 1
max-heapify(a,i)
max-heapify(a,i)
l=left(i)
r=right(i)
if l<=heap-size[a] and a[l]>a[i]
largest = l
else
largest = i
if r<=heap-size[a] and a[r]>a[largest]
largest = r
if largest != i
exchange a[i], a[largest]
max-heapify(a,largest)
parent(i)
return floor(i/2)
left(i)
return 2i
right(i)
return 2i+1
2、c++**
#include#includeusing namespace std;
//保證以i為根結點的子樹具有最大堆性質
void max_heapify(int* a, int i,int heap_size)
}//構建最大堆
void build_max_heap(int* a, int length, int heap_size)
void heapsort(int* a, int length)
}int main()
; int length = 5;
heapsort(a, length);
return 0;
}
堆排序 堆排序優化 索引堆排序
堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...
堆排序 堆排序優化 索引堆排序
堆排序 堆排序優化 索引堆排序 注 堆排序 索引堆排序 都是不穩定的排序。注 索引最大堆排序有誤!有沒有大神可以指點一二?1 堆 所有元素 都從索引0開始 父親結點索引 i 左孩子結點索引 2i 1 右孩子結點索引 2i 2 左後乙個非葉子結點索引 n 1 2 用於構建堆,從最後乙個非葉子結點索引開...
堆排序 模擬堆排序
838.堆排序 輸入乙個長度為n的整數數列,從小到大輸出前m小的數。輸入格式 第一行包含整數n和m。第二行包含n個整數,表示整數數列。輸出格式 共一行,包含m個整數,表示整數數列中前m小的數。資料範圍 1 m n 1051 m n 105,1 數列中元素 1091 數列中元素 109 輸入樣例 5 ...