http://www.cnblogs.com/wenzhonghua/p/6581221.html
归并排序+详解
小甲鱼讲的:
#include<iostream>
using namespace std;
#define maxsize 10
// 实现归并并把结果存在list1里
void merging(int*list1,int list1_size,int *list2,int list2_size)
{
inti,j,k;
inttemp[maxsize]; i=j=k=0;
while(i<list1_size&&j<list2_size)
if(list1[i]<=list2[j]) temp[k++]=list1[i++];
else temp[k++]=list2[j++];
while(i<list1_size) temp[k++]=list1[i++];
while(j<list2_size) temp[k++]=list2[j++];
for(intm=0;i<list1_size+list2_size;m++)
list1[m]=temp[m];
}
void mergesort(intk[],int n)
{
if(n>1)
{
int*list1=k;
intlist1_size=n/2;
int*list2=k+n/2;
intlist2_size=n-list1_size;
mergesort(list1,list1_size);
mergesort(list2,list2_size);
merging(list1,list1_size,list2,list2_size);
}
}
int main()
{
inti,a[10]={5,2,6,0,3,9,1,7,4,8};
mergesort(a,10);
for(i=0;i<10;i++)
cout<<a[i];
cout<<endl;
return0;
}
// 详解过程加图片 !! 源于视频小甲鱼之 归并排序!!!
#include<iostream>
#define size 10
using namespace std;
void mergearray(inta[],int first,int mid,int last)
{
inti,j,m,n;
i=first,m=mid; //i的开始=i i的结束=m
j=mid+1,n=last; // j的开始 j j的结束=n
intk=0;
inttemp[size];
while(i<=m&&j<=n) // 直到i从开始到结束就停止
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m) // 如果前半部分有剩的元素就将其一个一个添加至数组
temp[k++]=a[i++];
while(j<=n) // 同上
temp[k++]=a[j++];
for(i=0;i<k;i++) // 根据图可知 先组成2 5 然后是19 然后将2 5 与1 9 进行安放存入temp中 然后合并放入更大的数组 一直合并直到最后一个!!!!
a[first+i]=temp[i]; // k的值是从小变大 直到10
}
voidmerge_sort(int a[],int start,int end)//传入需要分开的数组
{
intmid=(start+end)/2;
if(start<end)
{
merge_sort(a,start,mid); //数组分开的左半部分
merge_sort(a,mid+1,end); // 右半部分
mergearray(a,start,mid,end); //分完之后进行排序有图有真相 图在文档中
}
}
int main()
{
inta[size];
inti;
for(i=0;i<size;i++)
cin>>a[i];
cout<<"排序之前:"<<endl;
for(i=0;i<size;i++)
cout<<a[i];cout<<endl;
merge_sort(a,0,size-1); // 开始排序、
cout<<"排序之后:"<<endl;
for(i=0;i<size;i++)
cout<<a[i];cout<<endl;
return0;
}
51nod:
#include<iostream> //重在分析过程!!! 重要的是我得说三遍 重在分析过程 !!!!重在分析过程 !!!!重在分析过程!!!! (算法的过程)
#include<string.h>
#define size 50010
using namespace std;
int ans=0;
void mergearray(inta[],int first,int mid ,int end)
{
inti,j,k,m,n;
i=first,m=mid;
j=mid+1,n=end;
k=0;
inttemp[size];
while(i<=m&&j<=n)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
{
temp[k++]=a[j++];
ans+=m-i+1;
}
}
while(i<=m) temp[k++]=a[i++];
while(j<=n)temp[k++]=a[j++];
for(i=0;i<k;i++)
a[first+i]=temp[i];
}
void merge_sort(inta[],int start,int end)
{
intmid=(start+end)/2;
if(start<end)
{
merge_sort(a,start,mid);
merge_sort(a,mid+1,end);
mergearray(a,start,mid,end);
}
}
int main()
{
inta[size];
inti,n;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
merge_sort(a,0,n-1);
for(i=0;i<n;i++)
cout<<a[i];
cout<<endl;
cout<<ans<<endl;
return0;
}
http://www.cnblogs.com/wenzhonghua/p/6581221.html
小甲鱼讲的:
#include<iostream>
using namespace std;
#define maxsize 10
// 实现归并并把结果存在list1里
void merging(int*list1,int list1_size,int *list2,int list2_size)
{
inti,j,k;
inttemp[maxsize]; i=j=k=0;
while(i<list1_size&&j<list2_size)
if(list1[i]<=list2[j]) temp[k++]=list1[i++];
else temp[k++]=list2[j++];
while(i<list1_size) temp[k++]=list1[i++];
while(j<list2_size) temp[k++]=list2[j++];
for(intm=0;i<list1_size+list2_size;m++)
list1[m]=temp[m];
}
void mergesort(intk[],int n)
{
if(n>1)
{
int*list1=k;
intlist1_size=n/2;
int*list2=k+n/2;
intlist2_size=n-list1_size;
mergesort(list1,list1_size);
mergesort(list2,list2_size);
merging(list1,list1_size,list2,list2_size);
}
}
int main()
{
inti,a[10]={5,2,6,0,3,9,1,7,4,8};
mergesort(a,10);
for(i=0;i<10;i++)
cout<<a[i];
cout<<endl;
return0;
}
// 详解过程加图片 !! 源于视频小甲鱼之 归并排序!!!
#include<iostream>
#define size 10
using namespace std;
void mergearray(inta[],int first,int mid,int last)
{
inti,j,m,n;
i=first,m=mid; //i的开始=i i的结束=m
j=mid+1,n=last; // j的开始 j j的结束=n
intk=0;
inttemp[size];
while(i<=m&&j<=n) // 直到i从开始到结束就停止
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m) // 如果前半部分有剩的元素就将其一个一个添加至数组
temp[k++]=a[i++];
while(j<=n) // 同上
temp[k++]=a[j++];
for(i=0;i<k;i++) // 根据图可知 先组成2 5 然后是19 然后将2 5 与1 9 进行安放存入temp中 然后合并放入更大的数组 一直合并直到最后一个!!!!
a[first+i]=temp[i]; // k的值是从小变大 直到10
}
voidmerge_sort(int a[],int start,int end)//传入需要分开的数组
{
intmid=(start+end)/2;
if(start<end)
{
merge_sort(a,start,mid); //数组分开的左半部分
merge_sort(a,mid+1,end); // 右半部分
mergearray(a,start,mid,end); //分完之后进行排序有图有真相 图在文档中
}
}
int main()
{
inta[size];
inti;
for(i=0;i<size;i++)
cin>>a[i];
cout<<"排序之前:"<<endl;
for(i=0;i<size;i++)
cout<<a[i];cout<<endl;
merge_sort(a,0,size-1); // 开始排序、
cout<<"排序之后:"<<endl;
for(i=0;i<size;i++)
cout<<a[i];cout<<endl;
return0;
}