merge.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:2k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. void Mpass(int x[],int y[],int k,int n); /*声明其为函数*/
  3. void Msort(int x[],int y[],int n); /*声明其为函数*/
  4. int main(void)
  5. {
  6. /*要排序整型数据序列*/
  7. int a[] = {26,5,37,1,61,11,59,15,48,19};
  8. int y[10]; /*用于暂时存储数据*/
  9. int i;
  10. printf("源数据为:    "); /*将源数据打印出来*/
  11. for(i = 0;i<10;i++)
  12. printf("[%2d]",a[i]);
  13. Msort(a,y,10); /*对源数据进行合并排序*/
  14. printf("n排序后的数据为:  ");
  15. for(i = 0;i<10;i++) /*将排序结果打印出来*/
  16. printf("%4d",a[i]);
  17. printf("n");
  18. return 0;
  19. }
  20. void Mpass(x,y,k,n)
  21. int x[]; /*要排序的数组*/
  22. int y[]; /*用于存储临时数据的数组*/
  23. int k; /*表示当前序列中有若干长度为k的相邻有序子序*/
  24. int n; /*要排序序列的长度为n*/
  25. {
  26. int i,j;
  27. int strat1,end1; /*对应第一个有序子序列L1起始和终止位置号*/
  28. int strat2,end2; /*对应第二个有序子序列L2起始和终止位置号*/
  29. int m; /*表示输入y中当前记录应放置的位置号*/
  30. strat1 = 0;
  31. m = 0;
  32. while(strat1+k<=n-1) /*当第一个子序列没有占据整个x数组*/
  33. {
  34. strat2 = strat1+k; /*为两个有序子序列起始终止位置号赋值*/
  35. end1 = strat2-1;
  36. /*如果第二的子序列长度不够k,则其终止位置号为n-1*/
  37. end2 = (strat2+k-1<=n-1)?strat2+k-1:n-1;
  38. for(i = strat1,j = strat2;i<=end1&&j<=end2;m++)
  39. {
  40. if(x[i]<=x[j])
  41. {
  42. y[m] = x[i];
  43. i++;
  44. }
  45. else
  46. {
  47. y[m] = x[j];
  48. j++;
  49. }
  50. }
  51. while(i<= end1)
  52. {
  53. y[m] = x[i];
  54. m++;
  55. i++;
  56. }
  57. while(j<= end2)
  58. {
  59. y[m] = x[j];
  60. m++;
  61. j++;
  62. }
  63. strat1 = end2+1;
  64. }
  65. /*将另一个序列中剩余的所有记录依次放到数组y中*/
  66. for(i=strat1;i<n;i++,m++)
  67. y[m] = x[i];
  68. }
  69. void Msort(x,y,n)
  70. int x[]; /*要排序的数组*/
  71. int y[]; /*用于存储临时数据的数组*/
  72. int n; /*数组长度*/
  73. {
  74. int i,k,count;
  75. k = 1;
  76. count = 1;
  77. while(k<n) /*当子序列比整个序列小时*/
  78. {
  79. Mpass(x,y,k,n); /*归并两有序子序列*/
  80. for(i= 0;i<n;i++)
  81. x[i] = y[i]; /*返回数据*/
  82. printf("n第%2d步后的结果==>  ",count++);
  83. for(i = 1;i<n+1;i++)
  84. {
  85. if((i ==n)&&((i%(2*k)!=0)))
  86. printf("%4d]",x[i-1]);
  87. else
  88. {
  89. if((i%(2*k)==1))
  90. printf("[%2d",x[i-1]);
  91. else if((i%(2*k))==0)
  92. printf("%4d]",x[i-1]);
  93. else
  94. printf("%4d",x[i-1]);
  95. }
  96. }
  97. k = 2*k; /*一次归并后新的有序子序列的长度*/
  98. }
  99. }