- 首先,关于建堆。建堆需要从下往上去调整,直观的说,这样才能保证最后根节点是比所有孩子节点要大的。
- 堆排序,就是先建堆,把根节点取出来,作调整,循环往复。
- 建堆的时候假设总的节点个数是n。从n/2开始调整就可以了,因为比这个节点小的节点是没有孩子节点的,没有调整的必要了。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 111;
int ori[maxn],tmp[maxn],cha[maxn];
int n;
bool issame(int a[],int b[])
{
for(int i=1;i<=n;i++)
if(a[i]!=b[i])
return false;
return true;
}
void printarray(int a[])
{
for(int i=1;i<=n;i++)
{
printf("%d",a[i]);
if(i<n)
printf(" ");
}
}
bool insertsort()
{
bool flag = false;
for(int i = 2;i<=n;i++)
{
sort(tmp+1, tmp+i);
flag = issame(cha,tmp);
if(flag == true)
{
sort(tmp+1, tmp+i+1);
printf("Insertion Sort\n");
printarray(tmp);
return true;
}
}
return false;
}
void downAdjust(int low ,int high)
{
int i=low,j=i*2;
while(j<=high){
if(j+1<=high&&tmp[j+1]>tmp[j])
j=j+1;
if(tmp[j]>tmp[i]){
swap(tmp[i],tmp[j]);
i=j;
j=i*2;
}
else
break;
}
}
bool heapsort()
{
bool flag = false;
for(int i = n/2;i >= 1;i--)
downAdjust(i,n);
for(int i=n;i>1;i--){
swap(tmp[i], tmp[1]);
downAdjust(1,i-1);
flag = issame(tmp, cha);
if(flag==true)
{
printf("Heap Sort\n");
i = i-1;
swap(tmp[i],tmp[1]);
downAdjust(1,i-1);
printarray(tmp);
return true;
}
}
return false;
}
int main(){
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d",&ori[i]);
tmp[i]=ori[i];
}
for(int i = 1;i<=n;i++)
scanf("%d",&cha[i]);
bool zz = insertsort();
if(zz == true)
return 0;
else
{
for(int i = 1;i<=n;i++)
tmp[i]=ori[i];
}
zz=heapsort();
return 0;
}