点击(此处)折叠或打开
#include<iostream> using namespace std; int *aux = NULL; void sort(int *a,int,int); void merge(int *a,int lo,int mid,int hi)//归并有序子数组 { int i =lo,j = mid+1; for (int k = lo;k <= hi;k++) { aux[k] = a[k]; } for (int k = lo;k <= hi;k++) { if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (aux[j]<aux[i]) a[k] = aux[j++]; else a[k] = aux[i++]; } } void sort(int *a,int n) { aux = new int[n]; sort(a,0,n-1); delete[] aux; } //将两个子数组排序,通过归并两个字数组来将这个数组排序 void sort(int *a,int lo,int hi) { if (hi <= lo) return; int mid = lo + (hi-lo)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); } int main() { int a[] = {1,2,4,3,5}; sort(a,5); for (int i = 0;i < 5;i++) { cout << a[i]<< " "; } cout << endl; return 0; } 首先是两两归并,然后是四四归并,然后是八八归并,一直下去!(自低向下)点击(此处)折叠或打开
#include<iostream> using namespace std; int *aux = NULL; void Merge(int *a,int lo,int mid,int hi) { int i = lo,j = mid+1; for (int k = lo;k <= hi;k++) { aux[k] = a[k]; } for (int k = lo;k <= hi;k++) { if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (aux[i]<aux[j]) a[k] = aux[i++]; else a[k] = aux[j++]; } } void sort(int *a,int n) { int N = n; aux = new int[N]; for (int sz = 1;sz < N;sz = sz+sz) { for (int lo = 0;lo<N-sz;lo += sz+sz) Merge(a,lo,lo+sz-1,min(lo+sz+sz-1,N-1)); } } int main() { int a[] = {5,4,3,2,1}; sort(a,5); for (int i = 0;i < 5;i++) { cout << a[i]<<" "; } cout << endl; return 0; } <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 阅读(95) | 评论(0) | 转发(0) | 0上一篇:经典排序算法之堆排序
下一篇:linux内存管理--缺页异常处理
相关热门文章 test123编写安全代码——小心有符号数...使用openssl api进行加密解密...一段自己打印自己的c程序...彻底搞定C语言指针详解-完整版... 给主人留下些什么吧!~~ 评论热议