8)排序④排序算法之归并排序
2015-12-04 10:32
453 查看
#include "iostream" #include "vector" #include "time.h" #include "iomanip" using namespace std; #define num 25 typedef int type;//type类型为int /* *将非降数组A,B,中的元素 */ void merge(vector<type>A,vector<type>B,vector<type>&C,int flags) { int ia =0,ib=0,ic=0; if(flags==1)//升序 { while(ia<A.size()&&ib<B.size()) { if(A[ia]<=B[ib]) { C.push_back(A[ia++]); }else C.push_back(B[ib++]); } }else if(flags==0){//降序 while(ia<A.size()&&ib<B.size()) { if(A[ia]>=B[ib]) { C.push_back(A[ia++]); }else C.push_back(B[ib++]); } } while(ia<A.size()) { C.push_back(A[ia++]); } while(ib<B.size()) { C.push_back(B[ib++]); } } /* *将n个长度的子表归并为m个子表(n为偶数,m=n/2;否,m=n/2+1) */ int Merge_sort(vector<vector<int>>array,int n,vector<vector<int>>&mid,int &count,int flags) { int i; if(n%2==0) { count = n/2; for(i=0;i<n-1;i=i+2) { merge(array[i],array[i+1],mid[i/2],flags); } }else{ count = n/2 +1; vector<int>temp; temp.clear(); for(i=0;i<n-2;i=i+2) { merge(array[i],array[i+1],mid[i/2],flags); } merge(array[n-1],temp,mid[count-1],flags); } return 0; } void Sort_Merge() { int i,j,flags; time_t start,end; vector<int>array; cout<<"Initialize Array:"<<endl; for(i=0;i<num;i++)//随机产生数组中的数据 { array.push_back(rand()%1000); cout<<setw(5)<<array[i]<<" "; if((i+1)%10==0)cout<<endl; } cout<<endl; cout<<"please inout flags[flags:1,升序;0降序]:"; cin>>flags; start = clock(); vector<vector<int>>arraymid(array.size()); for(i=0;i<array.size();i++)//初始化num个子表 { arraymid[i].push_back(array[i]); } vector<vector<int>>mid(num);//存放num个子表归并后的子表 int count =arraymid.size();//用于记录起始子表数目 int countmid = count;//用于记录归并后子表的数目 while(count!=1) { for(i=0;i<countmid;i++) { mid[i].clear();//清空待存放归并后子表的数组 } Merge_sort(arraymid,count,mid,countmid,flags);//归并 for(i=0;i<count;i++)//将归并后的子表赋给arraymid,然后继续归并 { arraymid[i].clear(); for(j=0;j<mid[i].size();j++) { arraymid[i].push_back(mid[i][j]); } } count = countmid;//子表数目更新为归并后的子表数目 } end = clock(); cout<<"The Merge_Sorted Array:"<<endl; //输出最终排序后的的结果 for(i=0;i<count;i++) { for(j=0;j<mid[i].size();j++) { cout<<setw(5)<<mid[i][j]<<" "; if((j+1)%10==0)cout<<endl; } } cout<<endl; cout<<"performnace time:"; cout<<(double)(end - start )/1000<<"Seconds"<<endl; } int main() { Sort_Merge(); return 0; }
相关文章推荐
- linux下面安装软件学习流程
- iOS9 以上的真机调试 不用证书
- ajax与HTML5 history pushState/replaceState实例
- 获取tableView刷新完成状态
- __FILE__,__LINE__,__DATE__,__TIME__,__FUNCTION__调试宏
- 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序
- ExtJs 告警弹窗
- MySQL导入EXCEL表格数据
- Valid Sudoku 数独的有效性
- stand up meeting 12/3/2015
- Z-Stack协议中几个重要概念的理解
- easyui--validate验证
- Hadoop伪分布式环境搭建
- UEFI的两种启动模式
- 在Legacy BIOS与UEFI 两种模式安装Windows 8操作系统的方法
- Git忽略文件的无效解决方案
- java 文件移动 常规四种方法 和利用FileCopyUtils.copy( , )方法
- mysql union和union all有什么不同? 通常谁的效率更高?
- 常用正则
- HTTPS 通信流程(签名、数字证书)