堆排序本身可以视为完全二叉树,利用其一些性质来解决排序问题。
再谈堆排序之前当然要先了解堆和完全二叉树。
完全二叉树
通俗来讲完全二叉树是由于满二叉树引起的,准确来说就是满二叉树缺失一部分但也有一些规定
1.所有叶子节点都出现在 k 或者 k-1 层,而且从 1 到 k-1 层必须达到最大节点数;
2.第 k 层可以不是满的,但是第 k 层的所有节点必须集中在最左边。
需要注意的是不要把完全二叉树和“满二叉树”搞混了,完全二叉树不要求所有树都有左右子树,但它要求:
3.任何一个节点不能只有左子树没有右子树
4.叶子节点出现在最后一层或者倒数第二层,不能再往上
堆:
简单介绍下不深入来介绍,
它是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在
O(1)~O(logn)之间。
堆还分为两种类型:大根堆、小根堆
顾名思义,就是保证根节点是所有数据中最大/小,并且尽力让小的节点在上方
假如有一无序数组s[7]={3,1,4,2,5,6},用堆排序顺序输出。
图解过程:
通过图解大概了解到堆排序的求解过程。
下面进行代码解释:
|#include
#include
using namespace std;
void adjustheap(int s[],int i,int len)
{
int lchild=2i;
int rchild=2i+1;
int max=i;
if(lchild<=len&&s[lchild]>s[max]) max=lchild;
if(rchild<=len&&s[rchild]>s[max]) max=rchild;
if(max!=i)
{
swap(s[i],s[max]);
adjustheap(s,max,len);
}
return ;
}
void buildheap(int s[],int len)
{
for(int i=len/2;i>0;i--)
{
adjustheap(s,i,len);
}
}
void heapsort(int s[],int len)
{
buildheap(s,len);
for(int i=len;i>0;i--)
{
swap(s[1],s[i]);
adjustheap(s,1,i-1);
}
}
int main()
{
int s[100];
int n;
cout<<"请输入元素个数:";
cin>>n;
cout<<"请输入元素";
for(int i=1;i<=n;i++)
cin>>s[i];
cout<<"排序前的序列:";
for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
heapsort(s,n);
cout<<"排序之后的序列:";
for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
return 0;
}| |
|–|--|
| | |
谢谢大家支持!!第一次写又哪里不对请指教。