堆排序

自己模拟了一遍,了解了整个排序的过程。。。

 

#include <stdio.h>
#include <string.h>

int size, n;

void HEAPIFY ( int *a, int i ) {                                            //找最大堆
     int l, r, largest, tmp;
     l = 2 * i;                                                    //表示的是节点,我就是这的错误找了好久
     r = 2 * i + 1;
     if ( l <= size && a[l] > a[i] )
         largest = l;
     else
         largest = i;
     if ( r <= size && a[r] > a[largest] )
         largest = r;
     if ( largest != i ) {
         tmp = a[i];
         a[i] = a[largest];
         a[largest] = tmp;
         HEAPIFY ( a, largest );
     }
}

void BUILD ( int *a ) {                                          //建堆
     size = n;
     for ( int i = n / 2; i >= 1; --i )
         HEAPIFY ( a, i );
}

void HEAPSORT ( int * a ) {                               //堆排序
     BUILD ( a );
     int tmp;
     for ( int i = n; i >= 2; --i ) {
         tmp = a[1];
         a[1] = a[i];
         a[i] = tmp;
         size = size - 1;
         HEAPIFY( a, 1 );
     }
}

int main ( ) {
    int a[100];                                               //数组的大小值得注意
    while ( scanf ( "%d", &n ) != EOF ) {
          memset ( a, 0, sizeof ( a ) );
          for ( int i = 1; i <= n; ++i )
               scanf ( "%d", &a[i] );
          HEAPSORT ( a );
          for ( int i = 1; i <= n; ++i )
               printf ( "%d ", a[i] );
          printf ( "\n" );
    }
}
分享到:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值