[算法]归并排序

  核心原理:归并排序是对分治思想的一种应用,通过将一个序列划分成2个有序的子序列,然后合并起来既是排序的结果。那要如何获得有序的子序列了?递归调用自身,将子序列一直拆分成元素只有1个的程度再向上回归,即可得到有序的子序列;

  特点:时间复杂度O(nlongn),空间复杂度 O(n),稳定

  下面贴一下分治法的解题步骤:

  a.分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例;

  b. 解决这些子问题,递归地求解各子问题的规模足够小,则直接求解;

  c. 合并这些子问题的解 成 原问题的解。

归并排序,c语言:

 1 #include <stdio.h>
 2 // time.h是用来统计执行时间的,可以去掉;
 3 #include <time.h>
 4 
 5 void merge(int arry[],int start,int half,int size){
 6     int left[half];
 7     int right[size-half];
 8 
 9     for(int l=0;l<half;l++){
10         left[l]=arry[l];
11     }
12 
13     for(int r=0;r<size-half;r++){
14         right[r]=arry[half+r];
15     }
16 
17     int t=half;
18     for(int i=0;i<size  ;i++){
19         if(start<half && t<size ){
20             if(left[start] < right[t-half]){
21                 arry[i]=left[start];
22                 start++;
23             } else{
24                 arry[i]=right[t-half];
25                 t++;
26             }
27 
28             // 左边序列遍历完
29         } else if( start >= half && t<size ){
30             arry[i]=right[t-half];
31             t++;
32 
33             // 右边序列遍历完
34         } else if(start < half && t >= size){
35             arry[i]=left[start];
36             start++;
37         }
38     }
39 }
40 
41 // 归并排序
42 void merge_sort(int  arry[],int size){
43     if(!arry || size < 2){
44         return;
45     }
46     // j是左边子序列的index,k是右边子序列的index
47     int k=size/2;
48     merge_sort(arry,k);
49     merge_sort(&arry[k],size-k);
50     merge(arry,0,k,size);
51 
52 }
原文地址:https://www.cnblogs.com/zhaohuaxishi/p/15620505.html