堆排序

时间复杂度: O(nlogn)

堆排序代码

#include "stdafx.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 100
#define MAX 100
void HEAP_UP(int a[],int n)//堆上
{
	int i,x;
	bool done=false;
	i=n;
	if(i==1)
		return;
	while(!(i==1||done))
	{
		if(a[i]>a[i/2])
		{
			x=a[i];
			a[i]=a[i/2];
			a[i/2]=x;
		}
		else
			done=true;
		i=i/2;
	
	}
}	
void HEAP_DOWN(int a[],int key,int n)//堆下
{
	int i,x;
	bool done=false;
	i=key;
	if(2*i>n)
		return;
	do
	{
		i=2*i;
		if((i+1<=n)&&(a[i]<a[i+1]))i++;
		if(a[i]>a[i/2])
		{
			x=a[i];
			a[i]=a[i/2];
			a[i/2]=x;
		}
		else
			done=true;	
	}while(!(2*i>n||done));
}
void HEAP_INSERT(int a[],int *n,int x)//堆插入
{
    *n=*n+1;
	a[*n]=x;
	HEAP_UP(a,*n);	
}
void HEAP_MAKE(int a[],int n)//构建堆
{
	for(int i=n/2;i>=1;i--)HEAP_DOWN(a,i,n);
}
void HEAP_DELETE(int a[],int i,int *n)//堆删除
{
	int x,y;
	x=a[i];
	y=a[*n];
	*n=*n-1;
	if(i==*n+1)return;
	a[i]=y;
	if(y>=x)HEAP_UP(a,i);
	else
		HEAP_DOWN(a,i,*n);
}
int HEAPSORT(int a[],int n)//堆排序
{
	HEAP_MAKE(a,n);
	for(int i=n;i>0;i--)
	{
		a[0]=a[1];
		a[1]=a[i];
		a[i]=a[0];
		HEAP_DOWN(a,1,i-1);
	}
	return 0;
}
void main ()
{
	int a[MAX];
	srand(time(NULL));
	//a[0]用作哨兵
	for(int i=1;i<MAX;i++)a[i]=rand()%10000;

	printf("old data\n");
	for(int j=1;j<MAX;j++)
		printf("%d\t",a[j]);

	HEAPSORT(a,MAX);

	printf("\n
		new data\n");
	for(int k=1;k<MAX;k++)
		printf("%d\t",a[k]);
}

测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值