堆排序。
关键是掌握 向下调整的思想,可以用递归完成,也可以用循环完成。
关于insertion sort,判断方法必须是寻找第一个不满足有序的下标,然后从这一点开始往后挨个比较。
至于为什么不能采用模拟的方法判断是否为insertion sort,原因很简单,因为可能存在以下情况:
10
3 1 2 7 8 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
关键在于位置7,8处,你无法断定是在哪个地方完成的当前排序,默认是排序到了最后一次。
附本人代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>V, res, tmp;
void Pri(vector<int>V) {
for (int i = 0; i < V.size(); i++) {
if (i == 0)printf("%d", V[i]);
else printf(" %d", V[i]);
}
}
void downjust(int begin,int end) {
int j = 2 * begin + 1;
if (j + 1 <= end && res[j + 1] > res[j])j++;
if (j <= end) {
if (res[begin] < res[j]) {
swap(res[begin], res[j]);
downjust(j, end);
}
}
}
int main() {
int N;
scanf("%d", &N);
V.resize(N); res.resize(N);
for (int i = 0; i < N; i++) {
scanf("%d", &V[i]);
}
for (int i = 0; i < N; i++) {
scanf("%d", &res[i]);
}
tmp = V;
bool flag = true;
int index = 0;
for (; index+1 < N; index++) {
if (res[index+1]<res[index])break;
}
index++;
for (int i = index; i < N; i++) {
if (res[i] != V[i]) {
flag = false;
break;
}
}
if (flag) {
printf("Insertion Sort\n");
sort(res.begin(), res.begin() + index+1);
Pri(res);
}
else {
printf("Heap Sort\n");
sort(tmp.begin(), tmp.end());
for (index = N - 1; index >= 0; index--) {
if (tmp[index] != res[index])break;
}
swap(res[0], res[index]);
downjust(0, index - 1);
Pri(res);
}
return 0;
}