排序入门--归并排序

来源:互联网 发布:技嘉超频软件 编辑:程序博客网 时间:2024/06/16 00:42

 

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 10using namespace std;  void mergearray(inta[],int first,int mid,int last){inti,j,m,n;i=first,m=mid;   //i的开始=i  i的结束=mj=mid+1,n=last;  // j的开始  j   j的结束=nintk=0;inttemp[size];  while(i<=m&&j<=n)   // 直到i从开始到结束就停止{if(a[i]<a[j])temp[k++]=a[i++];elsetemp[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 50010using 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 10using namespace std;  void mergearray(inta[],int first,int mid,int last){inti,j,m,n;i=first,m=mid;   //i的开始=i  i的结束=mj=mid+1,n=last;  // j的开始  j   j的结束=nintk=0;inttemp[size];  while(i<=m&&j<=n)   // 直到i从开始到结束就停止{if(a[i]<a[j])temp[k++]=a[i++];elsetemp[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;}

原创粉丝点击