堆排序

1.    堆是满足这样特性的数据结构:1.父结点的键值总是大于等于(或者小于等于)任何一个结点的值2.每个结点的左子树和右子树都是一个二叉树

      最大堆是父结点的键值总是大于等于子结点键值的二叉堆,最小堆是父结点的键值总是小于等于子结点键值的二叉堆。

       堆排序的基本思想是:先将待排序数组构造成堆,结点为n1,n2,n3,n4…nk,把堆顶元素(最大值)n1与堆中最后一个元素nk互换位置,此时,结点n1,n2,n3,n4,…n(k-1)可能不是最大堆,这时需要下滤的操作调整顺序,使之成为最大堆。接下来交换n1和n(k-1)的位置,调整堆序,重复进行k-1次,排序结束。

2.堆排序的程序为:

# include <iostream>
using namespace std;
# include <stdlib.h>
int main()
{
	int a[10]={3,34,23,67,9,10,8,12,56,45};
	int i=0;
	void heapsort(int a[],int);
	heapsort(a,10);
	for(i=0;i<10;i++)
		cout<<a[i]<<endl;
system("pause");
return 0;
}

void heapadjust(int a[],int s,int end)  //调整顺序,使之成为最大堆
{
	int tmp=a[s];
	int i=2*s+1;
	while(i<=end)
	{
	if((i+1<=end)&&a[i+1]>a[i])
		i++;
	if(a[i]<=tmp)
		break;
	a[s]=a[i];
	s=i;
	i=2*s+1;
	}
	a[s]=tmp;
}

void heapsort(int a[],int n)      //堆排序
{
int i=0,t;
for(i=(n-1)/2;i>=0;i--)           //建立最大堆
	heapadjust(a,i,n-1);
for(i=n-1;i>0;i--)                //交换a[0]和a[i]并调整顺序
{
	t=a[0];
	a[0]=a[i];
	a[i]=t;
	heapadjust(a,0,i-1);
}

}
3.堆排序分析

堆排序的时间复杂度为O(n*lgn),是不稳定的排序


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值