该题和A1089十分相似,也是和A1089一样的陷阱,即初始序列不参与比较是否与目标序列相同。(也就是说,题目中说的中间序列是不包括初始序列的,详见注释)
// 提供一组测试数据
4
3 4 2 1
3 4 2 1
// output
Insertion Sort
2 3 4 1
正确代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n, origin[110], change[110], tempOri[110];
void showArr() {
for(int i = 1;i<=n;i++) {
if(i != 1) cout << " ";
cout << tempOri[i];
}
}
bool isSame() {
for(int j = 1; j <= n; j++)
if(tempOri[j] != change[j]) return false;
return true;
}
bool insertSort() {
for(int i = 2;i<=n;i++) {
// -------- i从2开始循环,而不是1 ---------------
// 下标应该从2开始,第一次要排序的元素下标为[1, 2],写成1的话跟直接判断初始序列无恙
sort(tempOri+1, tempOri+i+1);
if(isSame()) {
sort(tempOri+1, tempOri + i + 2);
cout << "Insertion Sort" << endl;
showArr();
return true;
}
}
return false;
}
void downjust(int low, int high) {
int i = low, j = 2 * i;
while(j <= high) {
if(j + 1 <= high && tempOri[j+1] > tempOri[j]) {
j = j + 1;
}
if(tempOri[j] > tempOri[i]) {
swap(tempOri[j], tempOri[i]);
i = j;
j = 2 * i;
} else {
break;
}
}
}
void headSort() {
bool flag = false;
for(int i = n / 2; i >= 1; i--) {
downjust(i, n);
}
for(int i = n;i>=1;i--) {
if(i != n && isSame()) {
flag = true;
}
swap(tempOri[1], tempOri[i]);
downjust(1, i - 1);
if(flag == true) {
cout << "Heap Sort"<< endl;
showArr();
return;
}
}
}
int main() {
cin >> n;
for(int i =1;i<=n;i++) cin >> origin[i];
for(int i =1;i<=n;i++) tempOri[i] = origin[i];
for(int i =1;i<=n;i++) cin >> change[i];
if(!insertSort()) {
for(int i =1; i <= n; i++) tempOri[i] = origin[i];
headSort();
}
return 0;
}