堆 排序

#include "stdio.h"

int num[100] = {100, 3, 2, 0, 8, 9, 32, 12, 4, 1};
int n = 10;

void swap(int* a, int* b){
	int t = *a;
	*a = *b;
	*b = t;
}

void ajast(int p, int ed){
	if(2*p+1>=ed) return;
	if(2*p+2<ed && num[2*p+2]<num[2*p+1] && num[p]>num[2*p+2]){
		swap(&num[p], &num[2*p+2]);
		ajast(2*p+2, ed);
	}else if(num[p]>num[2*p+1]){
		swap(&num[p], &num[2*p+1]);
		ajast(2*p+1, ed);
	}
}

void show(){
	int i;
	for(i=0; i<n; i++)
		printf("%d ", num[i]);
	printf("\n");
}

void insert(int val){
	int t = val;
	int q = n++;
	int p = (q-1)/2;
	do{
		if(num[p]>t){
			num[q] = num[p];
			q = p;
			p = (p-1)/2;
		}else
			break;
	}while(!q);
	num[q] = t;
}

void main(){
	int i;
	for(i=n-1; i>=0; i--)
		ajast(i, n);
	show();

	insert(77); show();
	insert(6); show();

	for(i=0; i<n-1; i++){
		swap(&num[0], &num[n-i-1]);
		ajast(0, n-i-1);
	}
	show();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值