LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1575|回复: 7

在一个有序数列中插入一个任意数;阵列仍然保持有序,并输出。

[复制链接]
发表于 2004-5-19 21:53:14 | 显示全部楼层 |阅读模式
练习题:
ver0.3 改进了一下,增加了通用性

  1. /* 在一个有序数列中插入一个任意数;要求插入后
  2. * 阵列仍然保持有序,并输出。
  3. * 阵列如:0, 1, 2, 3, 5, 6, 7, 8, 9
  4. *     Copyright seablue at linuxsir.cn
  5. *          Version 0.3.0
  6. *           2004-05-21
  7. */
  8. #include <stdio.h>
  9. void insort(x,l,n)
  10. int l,x[],n;
  11. { int i,k;
  12.         /* l为数组总长度,n是数组实际长度;
  13.          * 如果数组没有多余空间,给出警告信息。
  14.          */
  15.         if (l <= n) printf("\nArray full!\n");
  16.         else
  17.                                 /* 输入一个任意数。
  18.                                  */
  19.         { printf("\nPlease input the value for inserting:\n");
  20.                 scanf("%d",&k);

  21.         /*
  22.          * 找到输入的数k的合适位置,并把大于k的数向右移动一个位置。
  23.          */

  24.                 for (i = n-1; (i >= 0)&&(k < x[i]); i--)
  25.                                 x[i+1]=x[i];
  26.                 x[i+1]=k;


  27.         /*
  28.          * 打印插入后的有序数列。
  29.          */

  30.          for (i = 0; i < (n+1); i++)
  31.                          printf("%d ",x[i]);
  32.                          printf("\n");
  33.         }
  34. }

  35. main()
  36. { int a[10] = { 0, 1, 2, 3, 5, 6, 7, 8, 9 };

  37.         /*
  38.          * insort()自定义函数的用法,调用。
  39.          * insort(array_name, length_of_array_defined, length_of_array_used)
  40.          */

  41.         insort(a,10,9);
  42. }
复制代码
发表于 2004-5-19 21:59:20 | 显示全部楼层
很简单的也很经典的C语言专业课练习题。
发表于 2004-5-19 22:10:17 | 显示全部楼层
采用优化的查找算法——斐波那契算法来解决此类插值问题试试看。
 楼主| 发表于 2004-5-19 22:25:46 | 显示全部楼层
:thank
我正参考C手册第五版,上面提到KS算法的改进版可以达到O(n的1.25次方)
你说的是这个吗?

摘录引人gap的Knuth和Sedgewich的shell改进版排序算法函数,供参考
(不会有版权问题吧?):


  1. void shellsort(register int v[], int n)
  2. {
  3.         registor int gap, i, j, temp;
  4.         gap = 1;
  5.         do (gap = 3*gap + 1); while (gap <= n);
  6.         for (gap /= 3; gap > 0; gap /= 3)
  7.             for (i = gap; i< n; i++) {
  8.                 temp = v[i];
  9.                 for (j = i-gam; (j >= 0)&&(v[j] > temp); j-=gap)
  10.                     v[j+gap] = v[j];
  11.                 v[j+gap] = temp;
  12.             }
  13. }
复制代码
发表于 2004-5-19 22:43:55 | 显示全部楼层
试试看啊。
 楼主| 发表于 2004-5-19 22:45:15 | 显示全部楼层
看看是否是楼上的那个?
发表于 2004-5-19 22:56:51 | 显示全部楼层
看得头都晕了,我指的不是这个,你把这个算法描述一下吧。
还有,shell改进算法?什么意思?
 楼主| 发表于 2004-5-19 23:23:00 | 显示全部楼层
:sorry我看了5遍了,也是没看明白:p
是个shell程序吧「函数」

把手册的内容给你抄下来

是Kernighan和Ritchie著作《C编程语言》中的shell排序例子的改进,改进的三个地方:

1)gap初始化时寻找不大于n的序列(1、4、13、40、121、。。。)中的最小值,每次遍历外循环时除以3。这样可以使排序加快20%-30%(这样选择gap作为初始值比用n更合适)。

2)内循环中的赋值次数从3次减少到一次。

3)增加了register和void存储类。可以大大提高性能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表