堆排序
话不多说,先上代码
#include<bits/stdc++.h>
using namespace std;
//堆排序
int a[101];
void sift(int a[],int i,int n)
{
//父子关系为二倍
int father=i;
int child=i*2;
while(child<=n)
{
if(child<n&&a[child]<a[child+1])child++;
if(a[father]>a[child])break;
else
{
int t=a[father];
a[father]=a[child];
a[child]=t;
father=child;
child=father*2;
}
}
}
void heapsort(int *a,int n)//int *a和int a[]的作用一样,可以互换,
//就是引入宿主第一个数的地址,可以按照自己的喜好
//使用其中一个
{
//初始化一个堆,一定要从下到上
for(int i=n/2;i>0;i--)
sift(a,i,n);
//堆顶和最后互换
for(int i=1;i<n;i++)
{
int t=a[1];
a[1]=a[n+1-i];
a[n+1-i]=t;
//重新刷新堆
sift(a,1,n-i);//递归再来一遍
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
heapsort(a,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
我们这里就使用(二叉树)大顶堆,升序为例子
依旧是互换,不过是根节点和最后的一个一子节点互换,并且去掉叶子(说的好高大上,其实专业名词就是吓人的,代码却简单的不要不要的)
根就是顶上的那个最大的那个数字嘛,那个叶子就是最小的那个嘛(出现了一个最重要的部分了,如何保证最小的位置呢?让他的孩子中最小的在最右边嘛if(child<n&&a[child]<a[child+1])child++;
(换位置不一定要用三角形转换,换换脚标也可以));
看的懂吗?啥?没看懂?快开打博主(qq:3100310659(备注c++学习,否则))