输入一组字符串,用2-路归并排序按字典顺序进行降序排序。
标签:mon 测试 pre cin 排序 pop merge new index
输入一组字符串,用2-路归并排序按字典顺序进行降序排序。
测试次数t
每组测试数据:数据个数n,后跟n个字符串,字符串不含空格。
对每组测试数据,输出2-路归并排序的每一趟排序结果。每组测试数据的输出之间有1空行。
#include<iostream> #include<queue> using namespace std; queue<string>Q1; queue<string>Q2; void printstring(string *str,int n) { for(int i=0;i<n;i++) { if(i!=n-1) cout<<str[i]<<" "; else cout<<str[i]<<endl; } } void mergeone(string *str,int low,int mid,int high) { int index=low; while(index<=mid) { Q1.push(str[index]); index++; } while(index<=high) { Q2.push(str[index]); index++; } for(int i=low;i<=high;i++) { if(Q1.empty()&&!Q2.empty()) { str[i]=Q2.front(); Q2.pop(); } else if(!Q1.empty()&&Q2.empty()) { str[i]=Q1.front(); Q1.pop(); } else if(!Q1.empty()&&!Q2.empty()) { if(Q1.front()>=Q2.front()) { str[i]=Q1.front(); Q1.pop(); } else { str[i]=Q2.front(); Q2.pop(); } } } } int main() { int T; cin>>T; while(T--) { int n; cin>>n; string *str=new string[n]; for(int i=0;i<n;i++) cin>>str[i]; int size=1; int low; int mid; int high; while(size<n) {///从第一个元素开始扫描,low代表第一个分割的序列的第一个元素 low=0; while(low+size<=n-1) {///当前的归并结束条件 mid=low+size-1;///mid代表第一个分割的序列的最后一个元素 high=mid+size;///high代表第二个分割的序列的最后一个元素 if(high>=n) { high=n-1; } mergeone(str,low,mid,high); low=high+1; } size*=2; printstring(str,n); } if(T) cout<<endl; } return 0; }
标签:mon 测试 pre cin 排序 pop merge new index
原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12183128.html