插入与归并(25)
2016-04-20 00:28
302 查看
思路:
将原始序列和中间序列分别存入int 向量,
先判断是否是插入排序(若为插入,则第一个小于前一个元素的元素及之后的元素都与org相同,不同则为merge;
若为插入排序,有序排序中小于cur[next]的元素输出,再输出cur[next],再依次输出剩下的元素
若为归并排序,下一次递归,每个有序子序列有2*next个元素,用sort函数将每个子序列排序,再依次输出
将原始序列和中间序列分别存入int 向量,
先判断是否是插入排序(若为插入,则第一个小于前一个元素的元素及之后的元素都与org相同,不同则为merge;
若为插入排序,有序排序中小于cur[next]的元素输出,再输出cur[next],再依次输出剩下的元素
若为归并排序,下一次递归,每个有序子序列有2*next个元素,用sort函数将每个子序列排序,再依次输出
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N, next = 0; cin >> N; vector<int> org, cur; enum property{insert, merge}pro = insert; for (int i = 0; i < N; ++i){ int temp; cin >> temp; org.push_back(temp); } for (int i = 0; i < N; ++i){ int temp; cin >> temp; cur.push_back(temp); } for (unsigned int i = 1; i < cur.size(); ++i) { if (cur[i] < cur[i - 1]) { next = i; for (; i < cur.size(); ++i) { if (cur[i] != org[i]) {//若为插入,则next及之后的元素都与org相同,不同则为merge; pro = merge; break; } } } if (pro == merge)//已确定为merge后不用再看后续 break; } if (pro == insert) { cout << "Insertion Sort" << endl; for (unsigned int i = 0; i < cur.size(); ++i) { if (cur[i] < cur[next])//比下一个要插入的元素小的先输出 cout << cur[i] << " "; else { cout << cur[next] << " ";//输出下一个要插入的元素 vector<int>::iterator it = cur.begin() + next; cur.erase(it);//迭代器在cur中删除下一个要插入的元素 for (; i < cur.size(); ++i) {//输出剩下的元素 cout << cur[i]; if (i != cur.size() - 1) cout << " "; } } } } else { cout << "Merge Sort" << endl; for (unsigned int i = 0; i < cur.size() / (next * 2); ++i)//下一次递归,每个有序子序列有2*next个元素 sort(cur.begin() + i*next * 2, cur.begin() + i*next * 2 + next * 2); for (unsigned int i = 0; i < cur.size(); ++i) { cout << cur[i]; if (i != cur.size() - 1) cout << " "; } } return 0; }
相关文章推荐