如果你在搜索引擎搜到本文!不建议阅读,是本人理解所写,给自己看的。
若你阅读,可能会让你浪费时间!!!
还是请自己查阅书籍,网上的垃圾博文太多了,推荐数据结构与算法分析---C语言表述。
不要浮躁沉下心来看,比上网看垃圾强多了!
相信自己努力可以改变某些东西!多思考和总结!
代码:
#include<stdio.h>
#define LeftChild(i) ( 2*i + 1 )
// 下标 i = 0 存储是最大的值 , 所以leftchild 是 2×i + 1 ;
void PercDown(int a[] , int i , int n)
{
int child , temp ;
for( temp = a[i] ; LeftChild(i) < n ; i = child )
{
child = LeftChild(i);
if ( (child != n -1) && (a[child+1] > a[child]) ) //挑选最大的子节点
child++;
if( temp < a[child] ) //最大的子节点 赋值给 父节点
a[i] = a[child] ;
else
break;
}
a[i] = temp ; //把之前节点 赋值给
}
void Swap(int *a , int *b)
{
int *Tmp ;
*Tmp = *a ;
*a = *b ;
*b = *Tmp ;
}
void HeapSort(int a[] ,int n )
{
int i ;
for(i = n/2 ; i >= 0 ; i-- ) // n/2 标号最大分支节点,即最大的非叶子节点标号 ;
PercDown(a , i , n); //求最大堆,采用下滤,使最大的浮上来,形成新的堆
printf("The first build heap:\n");
for(i = 0 ; i < n ; i++ )
printf("%d \t" , a[i]);
printf("\n");
for(i = n -1 ; i > 0 ; i-- )
{
Swap( &a[0] , &a[i] ) ; //本代码 堆排序是数组从下标0开始的 ,堆的最后元素和堆的首元素交换 ,仅仅用一个数组就可以排序
PercDown(a , 0 , i ) ; //每筛选出一个最大的堆,就开始下滤,建立新堆
}
}
int main()
{ int a[] = {31,41,59,26,53,58,97}; //测试数组
int len , i ;
len = sizeof(a)/sizeof(int);
HeapSort( a , len ); //建立堆
printf("This is a HeapSort Data:\n");
for(i = 0 ; i < len ; i++ ) //遍历已经拍好序的数组
printf("%d \t" , a[i]);
return 1;
}
结果:
The first build heap:
97 53 59 26 41 58 31
This is a HeapSort Data:
26 31 41 53 58 59 97
Process returned 1 (0x1) execution time : 0.025 s
Press any key to continue.