Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12934
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-08 11:44
文章分类
文章存档

2014年(16)

我的朋友
最近访客

分类: C/C++

2014-09-06 22:18:51


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <limits.h>

  6. #include <unistd.h>
  7. #define ENDF INT_MIN
  8. #define BUF_LEN 20
  9. #define SUM 100
  10. /*模拟输出*/
  11. int gettop(int *a)
  12. {
  13.         printf("%d ", a[1]);
  14.         return a[1];
  15. }
  16. /*模拟输入*/
  17. int getnext()
  18. {
  19.         static int next = 0;
  20.         if (next < SUM) {
  21.                 next ++;
  22.                 return rand() % 100;
  23.         } else
  24.                 return ENDF;
  25. }
  26. /*调堆*/
  27. void adjust(int a[], int n, int i)
  28. {
  29.         int tn = n / 2;
  30.         while (i <= tn) {
  31.                 int next = i * 2;
  32.                 if (next + 1 <= n && a[next+1] < a[next])
  33.                         next ++;
  34.                 if (a[next] < a[i]) {
  35.                         int tmp = a[next];
  36.                         a[next] = a[i];
  37.                         a[i] = tmp;

  38.                         i = next;
  39.                 } else
  40.                         break;
  41.         }
  42. }
  43. /*建堆*/
  44. void buildheap(int a[], int n)
  45. {
  46.         for (int i = n/2; i >= 1; i--)
  47.                 adjust(a, n, i);
  48. }
  49. int main()
  50. {
  51.         int b[21];
  52.         int count = 0;
  53.         for (int i=1; i<=20; i++) {
  54.                 b[i] = rand() % 100;
  55.         }
  56.         srand(time(NULL));


  57.         buildheap(b, BUF_LEN);
  58.         int index = BUF_LEN;
  59.         int last = INT_MIN;
  60.         while (true) {
  61.                 last = gettop(b);
  62.                 count++;
  63.                 int next = getnext();
  64.                 if (next == ENDF) {
  65.                         break;
  66.                 } else if (next < last) {
  67.                         if (index == 1) {
  68.                                 /*产生一个顺串*/
  69.                                 printf("\n");
  70.                                 b[1] = next;
  71.                                 buildheap(b, BUF_LEN);
  72.                                 index = BUF_LEN;
  73.                                 last = INT_MIN;
  74.                         } else {
  75.                                 b[1] = b[index];
  76.                                 b[index] = next;
  77.                                 index--;
  78.                                 adjust(b, index, 1);
  79.                         }
  80.                 } else {
  81.                         b[1] = next;
  82.                         adjust(b, index, 1);
  83.                 }
  84.         }
  85.  b[1] = b[index];
  86.         int i = index - 1;
  87.         while (i>0) {
  88.                 gettop(b);
  89.                 count++;
  90.                 b[1] = b[i];
  91.                 i--;
  92.                 adjust(b, i, 1);
  93.         }
  94.         /*最后一个顺串*/
  95.         putchar('\n');
  96.         int *tmp = b + index;
  97.         i = BUF_LEN - index;
  98.         buildheap(tmp, i);
  99.         while (i>0) {
  100.                 gettop(tmp);
  101.                 count++;
  102.                 tmp[1] = tmp[i];
  103.                 i--;
  104.                 adjust(tmp, i, 1);
  105.         }
  106.         printf("\n%d", count);
  107.         return 0;
  108. }

阅读(142) | 评论(0) | 转发(0) |
0

上一篇:avl2

下一篇:二项树

给主人留下些什么吧!~~