#include <stdlib.h> #include <stdio.h>
// * ---------------------------------------- */

// *  建立堆                                */

// * ---------------------------------------- */

void adjust_heap(int *heap,int root,int len)

{

  
int done;                      // * 是否可结束的变量     */

  
int j;

  
int temp;

   j
= 2 * root;                  // * 子结点指针           */

   temp
= heap[root];             // * 堆的根值           */

   done
= 0;                      // * 建立变量             */

  
while ( j <= len && !done )    // * 主循环              */

   {

        
if ( j < len )           // * 找最大的子结点       */

           
if ( heap[j] < heap[j+1] )

               j
++;               // * 下一结点             */

        
if ( temp >= heap[j] )   // * 比较树根值           */

            done
= 1;             // * 结束                 */

        
else

         {

            heap[j
/2] = heap[j];  // * 父结点是目前结点     */

            j
= 2 * j;            // * 其子结点             */

         }

   }

   heap[j
/2] = temp;              // * 父结点为根值         */

}

// * ---------------------------------------- */

// *  堆排序                                */

// * ---------------------------------------- */

void heap(int *heap,int len)

{

  
int i,j,temp;

  
for ( i = ( len / 2 ); i >= 1; i-- ) // *将二叉树转成堆*/

      adjust_heap(heap,i,len);

   printf(
"/n堆中数据: ");

  
for ( j = 1; j < 10; j++ )     // * 输出堆的内容       */

      printf(
"[%d]",heap[j]);

   printf(
"/n");                  // * 换行                 */

  
for ( i = len - 1; i >= 1; i-- )   // * 堆排序主循环   */

   {

      temp
= heap[i+1];           // * 交换最后元素         */

      heap[i
+1] = heap[1];

      heap[
1] = temp;

      adjust_heap(heap,
1,i);      // * 重建堆             */

      printf(
"/n处理内容: ");

     
for ( j = 1; j < 10; j++// * 输出处理内容         */

         printf(
"[%d]",heap[j]);

   }

}

// * ---------------------------------------- */

// *  主程序: 将数组数据用堆排序法来排序.   */

// * ---------------------------------------- */

void main()

{

 

  
int data[10] = { 0, 5, 6, 4, 8, 2, 3, 7, 1, 9 };

  
int i;

   printf(
"二叉树的内容: ");

  
for ( i = 1; i < 10; i++ )     // * 输出二叉树内容       */

      printf(
"[%d]",data[i]);

   heap(data,
9);                  // * 堆排序法           */

   printf(
"/n/n输出排序结果: ");

  
for ( i = 1; i < 10; i++ )     // * 输出最后内容         */

      printf(
"[%d]",data[i]);

   printf(
"/n");                  // * 换行                 */

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值