您的位置:首页 > 其它

堆排序

2014-08-18 08:53 99 查看
如果你在搜索引擎搜到本文!不建议阅读,是本人理解所写,给自己看的。

若你阅读,可能会让你浪费时间!!!

还是请自己查阅书籍,网上的垃圾博文太多了,推荐数据结构与算法分析---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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序 遍历 heap