題目描述
輸入一組字符串,用2-路歸並排序按字典順序進行降序排序。
輸入
測試次數t
每組測試數據:數據個數n,后跟n個字符串,字符串不含空格。
輸出
對每組測試數據,輸出2-路歸並排序的每一趟排序結果。每組測試數據的輸出之間有1空行。
樣例輸入
2 6 shenzhen beijing guangzhou futian nanshan baoan 10 apple pear peach grape cherry dew fig haw lemon marc
樣例輸出
shenzhen beijing guangzhou futian nanshan baoan shenzhen guangzhou futian beijing nanshan baoan shenzhen nanshan guangzhou futian beijing baoan pear apple peach grape dew cherry haw fig marc lemon pear peach grape apple haw fig dew cherry marc lemon pear peach haw grape fig dew cherry apple marc lemon pear peach marc lemon haw grape fig dew cherry apple
提示
#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; }