归并排序,递归与非递归
2015-09-01 10:02
302 查看
递归:
非递归:
即以1,2,4,8...为间隔对数组进行归并,需要用到额外的空间。空间复杂度是O(n),时间复杂度为O(nlogn)。
void merge_array(int a[],int low,int mid,int end){ int* temp = new int[end-low+1]; int index_pre = low; int index_post = mid+1; int i=0; while(index_pre<=mid&&index_post<=end){ if(a[index_pre]<a[index_post]) temp[i++] = a[index_pre++]; else temp[i++] = a[index_post++]; } if(index_pre<=mid)while(index_pre<=mid) temp[i++] = a[index_pre++]; if(index_post<=end)while(index_post<=end) temp[i++] = a[index_post++]; for(i=0;i<end-low+1;i++) a[low+i] = temp[i]; delete[] temp; } void merge_sort(int a[],int low, int high){ if(low<high){ int mid = (low+high)/2; merge_sort(a,low,mid); merge_sort(a,mid+1,high); merge_array(a,low,mid,high); } }
非递归:
即以1,2,4,8...为间隔对数组进行归并,需要用到额外的空间。空间复杂度是O(n),时间复杂度为O(nlogn)。
void mergeArray2(int a[],int b[], int low,int mid,int high){ int i=low,j=mid+1,k=i; while(i<=mid&&j<=high){ if(b[i]<b[j]){ a[k++]=b[i++]; }else{ a[k++]=b[j++]; } } while(j<=high) a[k++]=b[j++]; while(i<=mid) a[k++]=b[i++]; } void mergepass(int a[],int b[],int s,const int length){ int i=0; while(i<=length-2*s){ mergeArray2(a,b,i,i+s-1,i+2*s-1); i = i+2*s; } if(i+s<length)mergeArray2(a,b,i,i+s-1,length-1); else for(int j=i;j<length;j++)a[j]=b[j]; } void mergeSort(int temp[],const int length){ int i=0; int s=1; int* temp1= new int[length]; while(s<length){ mergepass(temp1,temp,s,length); s*=2; mergepass(temp,temp1,s,length); s*=2; } delete[] temp1; }
相关文章推荐
- Perl 正则表达式
- JavaScript 类定义常用方法(转)
- js收藏网页
- 使用Navicat for Oracle新建表空间、用户及权限赋予
- 鲁大师怎么查看cpu风扇转速|用鲁大师查看cpu风扇转速的方法
- 开发者常用的10个插件
- fiddle android
- DevExpress v15.1:Dashboard控件升级
- 剑指Offer面试题5:从尾到头打印链表
- 用VS2013在win7下编写的C++程序怎么在XP下运行?
- TCP协议三次握手连接四次握手断开和DOS攻击
- mysql check constraint doesn't work
- android:baselineAligned="false"
- html页面倒计时
- python调用Go代码
- NET代码运行在服务器JS运行在客户端
- Longest Substring Without Repeating Characters
- 代码SketchPaintCode绘制
- 文本区使用
- Eclipse中查看JDK源码设置