归并排序及C语言实现

来源:互联网 发布:智慧镇江老是网络错误 编辑:程序博客网 时间:2024/06/16 20:25

排序系列之(1)归并排序及C语言实现

有很多算法在结构上是递归的:为了解决一个给定的问题,算法需要一次或多次递归的调用其本身来解决相关的问题。这些算法通常采用分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后将结果合并,就能得到原问题的解。

分治模式在递归时一般都有三个步骤

分解:将原问题分解成一系类子问题

解决:递归的解各子问题。若子问题足够小,则直接求解。

合并:将子问题的结果合并成原问题的解。

归并排序在算法上完全依照了上述模式,操作如下。

分解:将n个元素分解成n/2个元素的子序列

解决:用合并排序法对两个子序列递归地排序

合并:将子问题的结果合并原问题的解。

以下是源代码实现

view plaincopy to clipboardprint?
void mergeSort(int a[],int left,int right)  
{  
    int i;  
    // 保证至少有两个元素  
    if(left < right)  
    {  
        i = (left+right)/2;  
        mergeSort(a,left,i);  
        mergeSort(a,i+1,right);  
        merge(a,left,right);  
    }  
}  
 
void merge(int a[],int left,int right)  
{  
    int begin1 = left;  
    int mid = (left+right)/2 ;  
    int begin2 = mid+1;  
    int k=0;  
    int newArrayLen = right-left+1;  
    int *b = (int*)malloc(newArrayLen*sizeof(int));  
    while(begin1<=mid && begin2<=right)  
    {  
        if(a[begin1]<=a[begin2])  
            b[k++] = a[begin1++];  
        else 
            b[k++] = a[begin2++];  
    }  
    while(begin1<=mid)  
        b[k++] = a[begin1++];  
    while(begin2<=right)  
        b[k++] = a[begin2++];  
    copyArray(b,a,newArrayLen,left);  
    free(b);  
}  
 
/** 
 * 复制数组 
 * source:源数组 
 * dest:目标数组 
 * len:源数组长度 
 * first:目标数组起始位置 
 * 
 */ 
void copyArray(int source[], int dest[],int len,int first)  
{  
    int i;  
    int j=first;  
    for(i=0;i<len;i++)  
    {  
        dest[j] = source[i];  
        j++;  
    }  
          
}  
void mergeSortTest()  
{  
    int a[] = {5, 18, 151, 138, 160, 63, 174, 169, 79, 200};  
    int len = sizeof(a)/sizeof(int);  
    showArray(a,len);  
    mergeSort(a,0,len-1);     
    showArray(a,len);  
      

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/taizhoufox/archive/2010/10/13/5938487.aspx

原创粉丝点击