归并排序的递归和非递归实现
来源:互联网 发布:邮箱注册淘宝的格式 编辑:程序博客网 时间:2024/05/22 08:16
归并排序是一个时间复杂度为O(nlogn)的算法,它可以由递归和非递归两种方式实现。
递归:
#include<iostream>using namespace std;void combine(int *nums,int l,int m,int r){ // cout<<"combine"<<l<<" "<<m<<" "<<r<<endl; int len = r-l+1; int *temp = new int[len+1]; int i = l; int j = m+1; int k =0; while(i<=m && j <=r){ if(nums[i] >nums[j]){ temp[k++] = nums[j]; j++; }else{ temp[k++] = nums[i]; i++; } } while(i <=m) {temp[k++] = nums[i]; i++;} while(j<=r) {temp[k++] = nums[j]; j++;} k =0; for(i =l;i<=r;i++) nums[i] = temp[k++]; delete []temp;}void merge_sort(int * nums,int left,int right){ if(left>=right) return; int mid = (left+right)/2; merge_sort(nums,left,mid); merge_sort(nums,mid+1,right); combine(nums,left,mid,right);}int main(){int nums[] = {5,4,2,1,6,8,9,3};int len = sizeof(nums)/sizeof(int);cout<<"before sort:";for(int i=0;i<len;i++) cout<<nums[i]<<" ";cout<<endl;merge_sort(nums,0,len-1);cout<<"after sort:";for(int i=0;i<len;i++) cout<<nums[i]<<" ";return 0;}
非递归实现:
#include<iostream>using namespace std;void combine(int *nums,int l,int m,int r){ // cout<<"combine"<<l<<" "<<m<<" "<<r<<endl; int len = r-l+1; int *temp = new int[len+1]; int i = l; int j = m+1; int k =0; while(i<=m && j <=r){ if(nums[i] >nums[j]){ temp[k++] = nums[j]; j++; }else{ temp[k++] = nums[i]; i++; } } while(i <=m) {temp[k++] = nums[i]; i++;} while(j<=r) {temp[k++] = nums[j]; j++;} k =0; for(i =l;i<=r;i++) nums[i] = temp[k++]; delete []temp;}void merge_sort(int * nums,int length){ for(int i = 1;i<length;i*=2){//枚举步长 int l = 0; while(l<length-1){ int mid = l+i-1; int r = mid +i; if(mid>= length-1) break;//mid已经大于数组长度了,证明已经拍完 if(r>=length){ r = length -1;}//右边步长超过数组长度要退回到数组长 if(r ==mid) break;//只有左边,则排完了 combine(nums,l,mid,r); l = r+1; } }}int main(){int nums[] = {5,4,2,1,6,8,9,3};int len = sizeof(nums)/sizeof(int);cout<<"before sort:";for(int i=0;i<len;i++) cout<<nums[i]<<" ";cout<<endl;merge_sort(nums,len);cout<<"after sort:";for(int i=0;i<len;i++) cout<<nums[i]<<" ";return 0;}
0 0
- 归并排序 递归和非递归实现
- 归并排序递归和非递归实现
- 归并排序非递归和递归实现
- 递归和非递归实现归并排序
- 归并排序的递归和非递归实现方法
- 归并排序的递归和非递归实现
- 归并排序的非递归实现
- 归并排序的非递归实现
- 归并排序的非递归实现
- 归并排序的非递归实现
- 归并排序的非递归实现
- 归并排序(递归和非递归方法实现)
- 归并排序数组实现之递归和非递归方法
- 合并排序(归并排序)的递归和非递归
- 归并排序的递归实现与非递归实现
- 归并排序的递归实现与非递归实现
- 非递归实现归并排序
- 非递归实现归并排序
- 以ZeroMQ谈消息中间件的设计
- Nginx 配置优化
- mysql Error 1205: Lock wait timeout exceeded; try restarting transaction
- PhpExcel中文帮助手册|PhpExcel使用方法
- hazelcast学习笔记---queue
- 归并排序的递归和非递归实现
- ubuntu 安装Pangolin 过程
- 高手详解SQL性能优化十条经验
- 网站不良信息整改报告
- 【自考】2016年10月自考总结
- 简单的方法就能把pdf转换成excel表格
- 生成订单存储过程(mysql)
- DataTables配置
- Mybatis3+Spring4+SpringMVC4 整合