归并排序: 实际就是递归, 分治 的运用。
思路: 假设一个数组 4 2 3 1
二分德到 4 2 3 1 两个数组
分到不能再分的时候再进行排序
例如 {4,2} 数组 分为 {4} {2} 两个数组 然后合并治理 得到 {2,4}
这样说很抽象,那就直接来个例子
上面进行了一次操作之后得到 {2,4} {1,3} 两个有序数组
我们声明一个temp[]数组 然后分别都 {2,,4}{1,3} 比较 2 与1比较 将小的放入temp中 -----> temp[0]=1
继续 2与3比较, --------->temp[1] =2
然后 4 ,3比较 ---------->temp[2]=3 注意 两个数组没有一个填充完的时候,那么分别取前数组的第一个进行比较,然后放入temp数组中
代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
void merge(int arr[],int first,int mid,int last)
{
int *temp=new int[last-first+1];
int i,j,cnt=0;
for (i=first,j=mid+1;i<=mid&&j<=last;){
if (arr[i]<arr[j]){
temp[cnt++]=arr[i++];
}
else {
temp[cnt++]=arr[j++];
}
}
for (;i<=mid;) //第一个序列有剩余
temp[cnt++]=arr[i++];
for (;j<=last;) //第二个序列有剩余
temp[cnt++]=arr[j++];
for (j=0,i=first;i<=last;i++,j++)
arr[i]=temp[j];
delete[] temp;
}
void merge_sort(int arr[],int start,int end)
{
if (start<end){
int mid=(start+end)/2;
merge_sort(arr,start,mid);
merge_sort(arr,mid+1,end);
merge(arr,start,mid,end);
}
}
int main()
{
int i,a[]={9,5,4,2,7,8,1,3,6,0};
printf ("排序前
");
for(i=0;i<10;i++)
printf("%d ",a[i]);
cout<<endl;
merge_sort(a,0,9);//分 // merge_sort(数组名,a,b) 只对 数组名[a] 到 数组名[b] 进行排序,小于a或大于b 则不进行处理
for(i=0;i<10;i++)
printf("%d ",a[i]); printf("
");
system("pause");
return 0;
}