归并排序(C语言实现)

归并排序:

归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

归并操作的过程如下:
    (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
    (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
    (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    (4) 重复步骤3直到某一指针到达序列尾

    (5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾


简单的说,就是将一个序列不断的进行二分(当然也可以三分、多分)分裂,然后递归下去,再合并。


源代码:

[cpp]  view plain  copy
  1. /*============================================================================= 
  2. # 
  3. #     FileName: Merge_Sort.c 
  4. #         Desc: 归并排序 
  5. # 
  6. #       Author: zhangyuqing    
  7. # 
  8. #      Created: 2014年6月29日23:18:16 
  9. #      Version: 0.0.1 
  10. # 
  11. =============================================================================*/  
  12.   
  13.   
  14. #include "stdafx.h"  
  15. #include <stdlib.h>  
  16. #include <malloc.h>  
  17.   
  18.   
  19. //归并操作  
  20. void merge(int src[], int des[], int low, int high ,int mid)  
  21. {  
  22.     int i = low;  
  23.     int k = low;  
  24.     int j = mid + 1;  
  25.   
  26.     while (( i <= mid ) && ( j <= high ))  
  27.     {  
  28.         if (src[i] < src[j])  
  29.         {  
  30.             des[k++] = src[i++];  
  31.         }  
  32.         else  
  33.         {  
  34.             des[k++] = src[j++];  
  35.         }         
  36.     }  
  37.     while (i <= mid)  
  38.     {  
  39.         des[k++] = src[i++];  
  40.     }  
  41.     while (j <= high)  
  42.     {  
  43.         des[k++] = src[j++];  
  44.     }  
  45. }  
  46.   
  47. void MSort(int src[], int des[] ,int low, int high, int max_size)  
  48. {  
  49.     int mid = (low + high) / 2;  
  50.     if (low == high)  
  51.     {  
  52.         des[low] = src[low];  
  53.     }  
  54.     else  
  55.     {  
  56.         int mid = (low + high) / 2;  
  57.         int * des_space = (int *)malloc(sizeof(int) * max_size);  
  58.   
  59.         if (NULL != des_space)  
  60.         {  
  61.             MSort( src, des_space, low, mid, max_size);  
  62.             MSort( src, des_space, mid+1, high, max_size);  
  63.   
  64.             merge( des_space, des, low, high, mid);  
  65.         }     
  66.   
  67.         free(des_space);  
  68.     }  
  69. }  
  70.   
  71. void Meger_Sort(int arr[], int low, int high, int len)  
  72. {  
  73.     MSort( arr, arr, low, high, len);  
  74. }  
  75.   
  76. int main(void)  
  77. {  
  78.     int arr[10];  
  79.       
  80.     for ( int i=0; i<10; i++)  //初始化数据  
  81.     {  
  82.         arr[i] = rand()%100;  //随机生成数据  
  83.     }  
  84.     printf("Before sort:\n");  //打印排序前的数据  
  85.     for (int i = 0; i < 10; i++)  
  86.     {  
  87.         printf("%d ",arr[i]);  
  88.     }  
  89.   
  90.     //开始排序  
  91.     Meger_Sort( arr, 0, 10-1, 10);  
  92.   
  93.   
  94.     printf("\nAfter sort:\n"); //打印排序后的数据  
  95.     for (int i = 0; i < 10; i++)  
  96.     {  
  97.         printf("%d ",arr[i]);  
  98.     }  
  99.     system("pause");  
  100.     return 0;  
  101. }  

运行结果:

[cpp]  view plain  copy
  1. Before sort:  
  2. 41 67 34 0 69 24 78 58 62 64  
  3. After sort:  
  4. 0 24 34 41 58 62 64 67 69 78 请按任意键继续. . .  

猜你喜欢

转载自blog.csdn.net/zjy900507/article/details/80530336