归并排序

作者:silence、2012年6月12日

本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处

算法思想:采用分治法,将数组进行分解成排序的子数组,然后进行合并成排序的数组

/*
  Name: MergeSort
  Copyright: 2012
  Author: silence
  Date: 06-12-12 14:34
  Description: 归并排序 
*/
#include <cstdlib>
#include <iostream>

using namespace std;
//a[]为待排序的数组
//s为数组的起始位置
//m 数组的中间位置
//e 数组的结束为止 
void merge(int a[],int s,int m,int e)
{
     //临时数组 
    int L[100],R[100];
    int l ,r;
    l = m-s+1;//低区长度
    r = e-m;// 高区长度
    //
    for(int i =0;i<l;i++)
    L[i] = a[s+i];
    for(int i =0;i<r;i++)
    R[i] = a[m+i+1]; 
    L[l]=R[r] = 1000; 
    for(int k = s,i=0,j=0;k<=e;k++)
    {
            
    if (L[i] <= R[j])
        {
            a[k] = L[i];
            i++;
        }
        else
        {
            a[k] = R[j];
            j++;
        }
    }   
     
} 

void MergeSort(int a[],int s,int e)
{
    if(s < e)
    {
        int i = (s+e)/2;  
         // 对前半部分进行排序
        MergeSort(a, s, i);
        // 对后半部分进行排序
        MergeSort(a, i + 1, e);
        // 合并前后两部分
        merge(a, s, i, e);   
    }     
     
} 
int main(int argc, char *argv[])
{
    int a[] = {10,6,5,3,2,8,11};
    MergeSort(a,0,6);
    for(int i =0;i<7;i++)
    cout<<a[i]<<"  ";
    cout<<endl; 
    system("PAUSE");
    return EXIT_SUCCESS;
}
运行结果如下图:



以上的合并算法还有待改进,不够好,以后再补充吧


上面的算法写的我不舒服,因为合并算法实在是恶心,特别是赋最大值的地方。今天补充一下,

两个有序数组合并的算法

/*
  Name: MergeSort
  Copyright: 2012
  Author: silence
  Date: 06-14-12 11:44
  Description: 有序数组的合并 
*/
#include <cstdlib>
#include <iostream>

using namespace std;
//a[]为待排序的数组
//s为数组的起始位置
//m 数组的中间位置
//e 数组的结束为止 
void merge(int a[],int s,int m,int e)
{
     //临时数组 
    int L[100],R[100];
    int l ,r;
    l = m-s+1;//低区长度
    r = e-m;// 高区长度
   
    for(int i =0;i<l;i++)
    {
      L[i] = a[s+i];
    }
    for(int i =0;i<r;i++)
    {
      R[i] = a[m+i+1];
    }
    int i =0,j=0,k=s;
    while(i<l&&j<r)//取尽一个数组 
    {
      if(L[i]<=R[j]) a[k++] = L[i++];
      else           a[k++] = R[j++];               
    } 
    while(i<l)//剩余的L数组 
    a[k++] = L[i++];
    while(j<r)//剩余的R数组,LR两者只能剩余一个 
    a[k++] = R[j++]; 
   
} 
基本的也都在代码的注释中,简单暴力

你可能感兴趣的:(归并排序)