1.归并排序法的思想及分段代码
归并排序法顾名思义是一种排序的算法,它是分而治之(divide-and-conquer)这种思想的典型体现。从名字上我们可以很清楚的知道这是一种通过归并实现数列有序的算法。算法图解如下:
那么什么是归并呢?归并从数列的操作上可以表示为:首先将一个需要排序的数列进行二分操作,接着对二分后的数列接着进行二分,直到每一个元素作为一个子序列,这体现了分而治之的“分”字诀。然后对相邻的两个子序列进行排序,排序完成后再对它二分前的子序列进行排序,以此类推,一步一步的完成整个排序工作。数列分割的代码如下:
void mergesort(int first,int last )//对已知数组进行分解
{
int middle;
if(first<last)
{
middle=(first+last)/2;
mergesort(first,middle);//左边分解
mergesort(middle+1,last);//右边分解
merge_sort(a,first,middle,last);//排序合并数组
}
}
排序的具体思想是:将有序数列a[i]~a[j]的第一个元素a[i]和有序数列a[j+1]~a[k]的第一个元素a[j+1]进行大小比较,将较小的元素输入到b[m](int m=i),将剩下的两个数列的首元比较大小,小的储存到b[m+1]中,以此类推直到一个数列的元素安全储存到数列b中,再将剩下的那个有序数列依次储存到b中。这就体现了分而治之的“治”字诀。数列排序的代码如下:
void merge_sort(int b[ ],int first,int middle,int last)
{
int temp[num];
int i,j,k;
i=first;
k=first;
j=middle+1;
while(i<=middle&&j<=last)
{
if(b[i]<=b[j]) temp[k++]=b[i++];
else temp[k++]=b[j++];
}
while(i<=middle)
{
temp[k++]=b[i++];
}
while(j<=last)
{
temp[k++]=b[j++];
}
for(int i=first;i<=last;i++)
{
a[i]=temp[i];
}
}
2.整个代码如下
#include<iostream>
using namespace std;
/**************************归并排序******************************/
const static int num=9;//数组的维数
static int * a;
void merge_sort(int b[ ],int first,int middle,int last)
{
int temp[num];
int i,j,k;
i=first;
k=first;
j=middle+1;
while(i<=middle&&j<=last)
{
if(b[i]<=b[j]) temp[k++]=b[i++];
else temp[k++]=b[j++];
}
while(i<=middle)
{
temp[k++]=b[i++];
}
while(j<=last)
{
temp[k++]=b[j++];
}
for(int i=first;i<=last;i++)
{
a[i]=temp [i];
}
}
void mergesort(int first,int last )//对已知数组进行分解
{
int middle;
if(first<last)
{
middle=(first+last)/2;
mergesort(first,middle);//左边分解
mergesort(middle+1,last);//右边分解
merge_sort(a,first,middle,last);//排序合并数组
}
}
int main()
{
a=new int[num];
for(int i=0;i<num;i++)
{
cin>>a[i];
}
mergesort(0,num-1);
for(int i=0;i<num;i++)
{
cout<<a[i]<<" ";
}
system("pause");
return 0;
}
这就是整个程序的代码,只要能理解归并的思想,同时将递归加入到程序中,编出这个代码就会变得so easy!