介绍
堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
步骤
略
排序效果
实现
#include <stdio.h>
#include <stdlib.h>
static void RandInitArray(int *arr, int num);
static void PrintArray(int *arr, int num);
static void HeapSortAsc(int *arr, int num);
static void HeapShiftDown(int *arr, int start, int end);
static void swap(int *x, int *y);
#define ARR_SIZE 20
int main()
{
int arr[ARR_SIZE];
RandInitArray(arr, ARR_SIZE);
PrintArray(arr, ARR_SIZE);
HeapSortAsc(arr, ARR_SIZE);
PrintArray(arr, ARR_SIZE);
return 0;
}
static void RandInitArray(int *arr, int num)
{
int i;
for (i=0; i<num; i++)
arr[i] = random()%10000;
}
static void PrintArray(int *arr, int num)
{
int i;
for (i=0; i<num; i++)
printf("%d ", arr[i]);
printf("\n");
}
static void HeapSortAsc(int *arr, int num)
{
int i;
for (i=num/2-1; i>=0; i--)
HeapShiftDown(arr, i, num - 1);
for (i=num-1; i>0; i--)
{
swap(&arr[0], &arr[i]);
HeapShiftDown(arr, 0, i - 1);
}
}
static void HeapShiftDown(int *arr, int start, int end)
{
int dead = start;
int son = dead * 2 + 1;
while (son <= end)
{
if (son + 1 < end && arr[son] < arr[son+1])
son += 1;
if (arr[dead] > arr[son])
break;
else
{
swap(&arr[dead], &arr[son]);
dead = son;
son = dead * 2 + 1;
}
}
}
static void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}