- 这个题判断是insert还是heap排序,判断还是比较容易但是,如果直接对已排序的数组进行下一步,最后一个测试点通过不过。。不知道为什么,新建一个数组排序到那一步能通过
#include<stdio.h>
int n;
int a[105],b[105],c[105];
int isinsert=0;
void print(int *c) {
printf("%d",c[0]);
for(int i=1; i<n; i++) printf(" %d",c[i]);
}
bool judge(int *a,int*b) {
for(int i=0; i<n; i++) {
if(a[i]!=b[i]) return 0;
}
return 1;
}
void swap(int &a,int&b) {
int temp=a;
a=b;
b=temp;
}
void insert_sort() {
int i,j,flag=0;
for(i=1; i<n; i++) {
int temp=a[i];
for(j=i; j>0&&a[j-1]>temp; j--) {
a[j]=a[j-1];
}
a[j]=temp;
if(judge(a,b)) {
isinsert=1;
flag=1;
continue;
}
if(flag) break;
}
}
void adjustheap(int *b,int l,int r) {
int temp=b[l],parent=l,child;
for(; 2*parent+1<=r; parent=child) {
child=2*parent+1;
if(child<r&&b[child]<b[child+1]) child++;
if(b[child]>temp) b[parent]=b[child];
else break;
}
b[parent]=temp;
}
void heap_sort() {
int head=b[0];
for(int i=n/2-1; i>=0; i--) {
adjustheap(b,i,n-1);
}
int flag=0;
for(int i=n-1; i>0; i--) {
swap(b[0],b[i]);
adjustheap(b,0,i-1);
if(b[0]==head) {
flag=1;
continue;
}
if(flag) break;
}
}
int main() {
int i;
scanf("%d",&n);
for(i=0; i<n; i++) {
scanf("%d",&a[i]);
c[i]=a[i];
}
for(i=0; i<n; i++) scanf("%d",&b[i]);
insert_sort();
if(isinsert) {
printf("Insertion Sort\n");
print(a);
} else {
printf("Heap Sort\n");
heap_sort();
print(b);
}
return 0;
}