10_8.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:3k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程序实例: 10_8.c                      */
  3. /*    堆排序法                            */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. /* ---------------------------------------- */
  7. /*  建立堆                                */
  8. /* ---------------------------------------- */
  9. void adjust_heap(int *heap,int root,int len)
  10. {
  11.    int done;                      /* 是否可结束的变量     */
  12.    int j;
  13.    int temp;
  14.    j = 2 * root;                  /* 子结点指针           */
  15.    temp = heap[root];             /* 堆的根值           */
  16.    done = 0;                      /* 建立变量             */
  17.    while ( j <= len && !done )    /* 主循环              */
  18.    {
  19.          if ( j < len )           /* 找最大的子结点       */
  20.             if ( heap[j] < heap[j+1] )
  21.                j++;               /* 下一结点             */
  22.          if ( temp >= heap[j] )   /* 比较树根值           */
  23.             done = 1;             /* 结束                 */
  24.          else
  25.          {
  26.             heap[j/2] = heap[j];  /* 父结点是目前结点     */
  27.             j = 2 * j;            /* 其子结点             */
  28.          }
  29.    }
  30.    heap[j/2] = temp;              /* 父结点为根值         */
  31. }
  32. /* ---------------------------------------- */
  33. /*  堆排序                                */
  34. /* ---------------------------------------- */
  35. void heap(int *heap,int len)
  36. {
  37.    int i,j,temp;
  38.    for ( i = ( len / 2 ); i >= 1; i-- ) /*将二叉树转成堆*/
  39.       adjust_heap(heap,i,len);
  40.    printf("n堆中数据: ");
  41.    for ( j = 1; j < 10; j++ )     /* 输出堆的内容       */
  42.       printf("[%d]",heap[j]);
  43.    printf("n");                  /* 换行                 */
  44.    for ( i = len - 1; i >= 1; i-- )   /* 堆排序主循环   */
  45.    {
  46.       temp = heap[i+1];           /* 交换最后元素         */
  47.       heap[i+1] = heap[1];
  48.       heap[1] = temp;
  49.       adjust_heap(heap,1,i);      /* 重建堆             */
  50.       printf("n处理内容: ");
  51.       for ( j = 1; j < 10; j++ )  /* 输出处理内容         */
  52.          printf("[%d]",heap[j]);
  53.    }
  54. }
  55. /* ---------------------------------------- */
  56. /*  主程序: 将数组数据用堆排序法来排序.   */
  57. /* ---------------------------------------- */
  58. void main()
  59. {
  60.    /* 二叉树结点数据 */
  61.    int data[10] = { 0, 5, 6, 4, 8, 2, 3, 7, 1, 9 };
  62.    int i;
  63.    printf("二叉树的内容: ");
  64.    for ( i = 1; i < 10; i++ )     /* 输出二叉树内容       */
  65.       printf("[%d]",data[i]);
  66.    heap(data,9);                  /* 堆排序法           */
  67.    printf("nn输出排序结果: ");
  68.    for ( i = 1; i < 10; i++ )     /* 输出最后内容         */
  69.       printf("[%d]",data[i]);
  70.    printf("n");                  /* 换行                 */
  71. }