• 归并排序

    归并排序

    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. }