【题意】
和1089差不多,无非是归并排序改成了堆排序。
【思路】
直接码即可
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
void adjustDown(int cur, int size, vector<int> &vec){
int index = 0, maximum = vec[cur - 1];
if (2 * cur <= size && vec[2 * cur - 1] > maximum){
index = 1;
maximum = vec[2 * cur - 1];
}
if (2 * cur + 1 <= size && vec[2 * cur] > maximum){
index = 2;
maximum = vec[2 * cur];
}
switch (index){
case 1:
swap(vec[cur - 1], vec[2 * cur - 1]);
adjustDown(2 * cur, size, vec);
break;
case 2:
swap(vec[cur - 1], vec[2 * cur]);
adjustDown(2 * cur + 1, size, vec);
break;
default:
break;
}
}
void buildHeap(vector<int> &vec){
for (int i = n / 2; i >= 1; --i){
adjustDown(i, n, vec);
}
}
int main(){
cin >> n;
vector<int> origin(n), sorted(n);
for (int i = 0; i < n; ++i){
cin >> origin[i];
}
for (int i = 0; i < n; ++i){
cin >> sorted[i];
}
//Insertion Sort
vector<int> tmp = origin;
for (int i = 2; i <= n; ++i){
sort(tmp.begin(), next(tmp.begin(), i));
if (tmp == sorted){
cout << "Insertion Sort" << endl;
sort(tmp.begin(), next(tmp.begin(), i + 1));
for (int j = 0; j < n; ++j){
if (j){
cout << " ";
}
cout << tmp[j];
}
system("pause");
return 0;
}
}
//Heap Sort
buildHeap(origin);
tmp = origin;
for (int i = n - 1; i > 0; --i){
swap(tmp[0], tmp[i]);
adjustDown(1, i, tmp);
if (tmp == sorted){
cout << "Heap Sort" << endl;
--i;
swap(tmp[0], tmp[i]);
adjustDown(1, i, tmp);
for (int j = 0; j < n; ++j){
if (j){
cout << " ";
}
cout << tmp[j];
}
break;
}
}
system("pause");
return 0;
}