归并排序

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MaxSize 100
  4. typedef int KeyType; /*关键字类型*/
  5. typedef char ElemType[10]; /*其他数据项类型*/
  6. typedef struct
  7. {
  8. KeyType key; /*关键字域*/
  9. ElemType data; /*其他数据域*/
  10. } LineList; /*线性表元素类型*/
  11. void Merge(LineList R[],int low,int mid,int high)
  12. {
  13. LineList *R1;
  14. int i=low,j=mid+1,k=0; /*k是R1的下标,i、j分别为第1、2段的下标*/
  15. R1=(LineList *)malloc((high-low+1)*sizeof(LineList)); /*动态分配空间*/
  16. while (i<=mid && j<=high) /*在第1段和第2段均未扫描完时循环*/
  17. if (R[i].key<=R[j].key) /*将第1段中的记录放入R1中*/
  18. { R1[k]=R[i];
  19. i++;k++;
  20. }
  21. else /*将第2段中的记录放入R1中*/
  22. { R1[k]=R[j];
  23. j++;k++;
  24. }
  25. while (i<=mid) /*将第1段余下部分复制到R1*/
  26. {
  27. R1[k]=R[i];
  28. i++;k++;
  29. }
  30. while (j<=high) /*将第2段余下部分复制到R1*/
  31. { R1[k]=R[j];
  32. j++;k++;
  33. }
  34. for (k=0,i=low;i<=high;k++,i++) /*将R1复制回R中*/
  35. R[i]=R1[k];
  36. }
  37. void MergePass(LineList R[],int length,int n)
  38. {
  39. int i;
  40. for (i=0;i+2*length-1<n;i=i+2*length) /*归并length长的两相邻子表*/
  41. Merge(R,i,i+length-1,i+2*length-1);
  42. if (i+length-1<n) /*余下两个子表,后者长度小于length*/
  43. Merge(R,i,i+length-1,n-1); /*归并这两个子表*/
  44. }
  45. void MergeSort(LineList R[],int n) /*二路归并算法*/
  46. {
  47. int length;
  48. for (length=1;length<n;length=2*length)
  49. MergePass(R,length,n);
  50. }
  51. void main()
  52. {
  53. LineList R[MaxSize];
  54. KeyType a[]={75,87,68,92,88,61,77,96,80,72};
  55. int n=10,i;
  56. for (i=0;i<n;i++)
  57. R[i].key=a[i];
  58. printf("排序前:");
  59. for (i=0;i<n;i++)
  60. printf("%3d",R[i].key);
  61. printf("\n");
  62. MergeSort(R,n);
  63. printf("排序后:");
  64. for (i=0;i<n;i++)
  65. printf("%3d",R[i].key);
  66. printf("\n");
  67. }