作者: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++];
}
基本的也都在代码的注释中,简单暴力