归并排序算法

归并排序:  实际就是递归,  分治 的运用。

思路:       假设一个数组    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;
}

原文地址:https://www.cnblogs.com/q1204675546/p/9282865.html