1.学习了堆排序
2.在判断顺序也要考虑==....找了好久才发现...
#include<iostream>
#include<algorithm>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> a, b;
void adjustHeap(vector<int> & b, int l, int h) {
int tmp = b[l];
for(int i=l*2+1; i<h; i=i*2+1) {
if(i+1<h && b[i]<b[i+1]) { //右子节点最大
i++;
}
if(b[i] > tmp) { //如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
b[l] = b[i];
l = i;
} else break;//子节点都小于当前节点 不需要操作
}
b[l] = tmp;
}
void heapSort(vector<int> & b, int l, int h) {
int len = b.size();
//构建大根堆
for(int i=len/2-1; i>=0; i--) {
adjustHeap(b, i, len);
}
for(int i=len-1; i>0; i--) {
swap(b[i], b[0]);
adjustHeap(b, 0, i);
}
}
int main() {
int n;
cin >> n;
a.resize(n);
b.resize(n);
for(int i=0; i<n; i++) {
cin >> a[i];
}
for(int i=0; i<n; i++) {
cin >> b[i];
}
int idx=1;
for(; idx<n && b[idx-1]<=b[idx]; ) {
idx++;
}
int idxt = idx;
while(idx < n && a[idx] == b[idx]) idx++;
if(idx == n) {
printf("Insertion Sort\n");
if(idxt<n)
idxt += 1;
else idxt = n;
sort(b.begin(), b.begin() + idxt);
} else {
printf("Heap Sort\n");
idx = n-1;
while(idx>0 && b[idx] >= b[0]) idx--;
swap(b[0], b[idx]);
adjustHeap(b, 0, idx);
}
printf("%d", b[0]);
for(int i = 1; i < n; i++)
printf(" %d", b[i]);
return 0;
}