排序 堆排序

2021-08-07 15:30:32 字數 1381 閱讀 9352

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 ...