您的位置:首页 > 其它

插入与归并(25)

2016-04-20 00:28 302 查看
思路:

将原始序列和中间序列分别存入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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: