排序入门--归并排序
来源:互联网 发布:技嘉超频软件 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 排序入门--归并排序
- 归并排序菜鸟入门
- 归并排序-归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Shell 之 轻松入门
- Oracle在Linux系统连接很慢的问题
- LeetCode 231. Power of Two
- 使用yum安装vim报出Error Summary的解决办法
- leetcode--42. Trapping Rain Water
- 排序入门--归并排序
- hdu1754
- 一步转移概率矩阵的实现
- StringUtils.hasText()
- group by的rollup、cube、grouping、grouping sets 的用法浅析
- 实现字符串中各单词翻转
- javascript中this的使用详解
- 使用LLVM分析函数CFG
- Xcode 4开发第一个iPhone程序 图文实例(下)