【堆排序算法】
- 创建堆:升序 —-> 大堆
降序 —-> 小堆 执行以下步骤,直到数组为空
1.把堆顶元素array[0]和当前堆的最后一个元素交换
2.堆元素个数减1
3.由于第一步交换元素之后,可能导致不满足堆的定义,向下调整堆排序的实践复杂度:O(n * log2 n)
- 堆排序不稳定
代码:
// HeapSort.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
typedef int DataType;
typedef int(*Compare)(const void *a, const void *b);
int HS_CompareAscending_order(const void *a, const void *b);
int HS_CompareDescending_order(const void *a, const void *b);
void HeapSort(DataType *array, int size, Compare cmp);
// HeapSort.c
#include "HeapSort.h"
void HS_swap(DataType *a, DataType *b)
{
DataType temp = *a;
*a = *b;
*b = temp;
}
// 降序 -- 小堆
int HS_CompareAscending_order(const void *a, const void *b)
{
return *(DataType*)a - *(DataType*)b;
}
// 升序 -- 大堆
int HS_CompareDescending_order(const void *a, const void *b)
{
return *(DataType*)b - *(DataType*)a;
}
void HS_Adjust(DataType *array, int size, int parent, Compare cmp)
{
int child = parent * 2 + 1;
assert(array);
while (child < size)
{
if ((child + 1) < size && cmp(&array[child], &array[child + 1]) > 0)
{
child += 1;
}
if (array[parent] < array[child])
{
HS_swap(&array[parent], &array[child]);
parent = child;
child = parent * 2 + 1;
}
else
{
return;
}
}
}
void HeapSort(DataType *array, int size, Compare cmp)
{
int end = size - 1;
// 1.建堆
int root = ((size - 1) - 1) >> 1;
for (; root >= 0; --root)
{
HS_Adjust(array, size, root, cmp);
}
// 2.排序
while (end)
{
HS_swap(&array[0], &array[end]);
HS_Adjust(array, end, 0, cmp);
--end;
}
}
测试
// test.c
#include "HeapSort.h"
void TestHeapSort()
{
int arr[] = { 53, 17, 78, 9, 45, 65, 87, 23, 31 };
int size = sizeof(arr) / sizeof(arr[0]);
int i = 0;
HeapSort(arr, size, HS_CompareDescending_order);
for (i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
TestHeapSort();
system("pause");
return 0;
}
测试结果:
如有不正,还请指出,有劳!!!