上一篇博客里详细地展示了堆排序是怎么实现的,其实它看上去思路挺复杂但是C语言程序实现起来蛮简单。
主要是通过循环来在二叉树上不断遍历调整结点顺序,形成大顶堆(或小顶堆)并且移走已经确定位置的那个结点。
这里实现还是按照上篇博文中的大顶堆来实现:
直接放代码好了:
#include<stdio.h>
#include<stdlib.h>
void HeapSort(int *s, int length);
void HeapAdjust(int *s, int v, int length);
int main()
{
int i;
int s[11];
for(i=1; i<=10; i++)
scanf("%d", &s[i]);
int length = 10;
HeapSort(s, length);
for(i=1; i<=10; i++)
printf("%d ", s[i]);
return 0;
}
void HeapAdjust(int *s, int v, int length)
{
int temp, j;
temp = s[v];
for(j=2*v; j<=length; j*=2)
{
if(j<length && s[j]<s[j+1])
j++;
if(temp >= s[j])
break;
s[v] = s[j];
v = j;
}
s[v] = temp;
}
void swap(int *s, int m, int n)
{
int tmp;
tmp = s[m];
s[m] = s[n];
s[n] = tmp;
}
void HeapSort(int *s, int length)
{
int i;
for(i=length/2; i>0; i--)
HeapAdjust(s, i, length);
for(i=length; i>1; i--)
{
swap(s, 1, i);
HeapAdjust(s, 1, i-1);//此时整个数组需要遍历的长度就减少了1
}
}
程序运行结果: