堆排序

来源:互联网 发布:xmind8 for mac序列号 编辑:程序博客网 时间:2024/06/06 09:02

如果你在搜索引擎搜到本文!不建议阅读,是本人理解所写,给自己看的。

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

还是请自己查阅书籍,网上的垃圾博文太多了,推荐数据结构与算法分析---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.



0 0
原创粉丝点击