选择排序
选择排序分两种,一种是简单选择排序,大家在学c语言时都学过,另一种复杂一点,叫堆排序,我们重点讲一下堆排序。
堆排序
首先,堆是一个完全二叉树。
若每一个根节点都比它的孩子节点大,则为大根堆。
若每一个根节点都比它的孩子节点小,则为小根堆。
过程
假设有下面8个数:(3,4,5,2,1,8,6,7),首先建立完全二叉树:
接着将其转换成大根堆。我们从第n/2=4个元素开始转换,即编号为的2节点。由于2比7小,所以7上来,2下去
接着看第三个元素:5
8和6都比5大,因此选择最大的和5交换,即8和5交换
接着到第二个元素:4
由于7比4大,因此7和4交换
最后,3和8交换
最后根节点和最后一个节点交换位置,从第n/2-1个节点开始继续上面的过程
#include<iostream>
using namespace std;
int main()
{
int a[20];
int n,i,t,h;
cin>>n;
int tag;
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
tag=n/2-1;
h=n;
while(tag>=0)
{
while(tag>=0)
{
if(2*tag+2<h)
{
if(a[2*tag+1]>=a[2*tag+2]&&a[2*tag+1]>=a[tag])
{
t=a[tag];
a[tag]=a[tag*2+1];
a[tag*2+1]=t;
tag--;
}
else if(a[2*tag+1]<=a[2*tag+2]&&a[2*tag+2]>=a[tag])
{
t=a[tag];
a[tag]=a[tag*2+2];
a[tag*2+2]=t;
tag--;
}
else
{
tag--;
}
}
else{
if(a[2*tag+1]>=a[tag])
{
t=a[tag];
a[tag]=a[tag*2+1];
a[tag*2+1]=t;
tag--;
}
else{
tag--;
}
}
}
t=a[0];
a[0]=a[h-1];
a[h-1]=t;
h--;
tag=h/2-1;
}
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
}