思想:將數組轉爲二叉樹,調整爲最大堆,然後將第一個數與末尾數交換,在調整最大堆,重複步驟
#include <stdio.h>
//輸出
void print(int array[], int size)
{
int i = 0;
for(i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
//兩數交換
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//調整最大堆
void maxHeapify(int array[], int i, int size)
{
int left = i * 2 + 1; //採用索引值計算,數組第一個下標從0開始
int right = i * 2 + 2;
int max_index = 0;
if(right >= size || left >= size) //大於數組大小返回
{
return;
}
//比較出根、左節點、右節點最大的
if(array[left] > array[i])
{
max_index = left;
}
else
{
max_index = i;
}
if(array[right] > array[max_index])
{
max_index = right;
}
//如果最大的不爲根節點,則進行交換,
//並對進行交換的子節點進行對調整
if(max_index != i)
{
swap(&array[i], &array[max_index]);
maxHeapify(array, max_index, size);
}
}
//建立最大堆
void build_max_heap(int array[], int size)
{
//計算第一個根節點的下標
int index = (size - 2) / 2;
int i = 0;
//從下往上進行根節點遍歷
for(i = index; i > -1; i--)
{
maxHeapify(array, i, size);
}
}
void heap_sort(int array[], int size)
{
//建立最大堆
build_max_heap(array, size);
while(size != 1)
{
//交換第一個節點和最後一個節點
swap(&array[0], &array[size - 1]);
//堆大小減一,因爲最後一個數爲最大,爲已排序的數
size--;
//調整堆
maxHeapify(array, 0, size);
}
}
int main()
{
int array[] = {23, 45, 2, 54, 34, 3, 67, 234, 3, 67, 57};
heap_sort(array, 11);
int i = 0;
print(array, 11);
return 0;
}