堆排序(小根堆)

 void push(int x) {
    h[++lenn]=x;
    int index=len;
    while(index>1 && h[index]<h[index/2]){
        swap(h[index],h[index/2]);
        index=index/2;
    }
 }//在数组后面加多一个元素,进行调整时只需要往上调整,跟父节点比较就好(不用从最后一个有节点的节点开始遍历,进行向下调整)
void down_adjust(int n){
	int num=n,k=n*2;//k为左儿子
	int tmp=h[n];
	while(k <= len){
		if(k < len && h[k] > h[k+1]){
			k++;
		}//如果右儿子存在,而且值比左儿子小,那么k++,待会父节点跟右儿子比较
		if(h[k] >= tmp){
			break;
		}
		else{
			h[num]=h[k];
			num=k;
			k=k*2;
		}
	}
	h[num]=tmp;
	}
}//向下调整
 void pop(int n) {
 	if(len >= 1){
    swap(h[1],h[len]);
    len--;
	down_ adjust(n);
}//删除某个位置的结点,这时候只需要跟最后一个数交换,然后再向下调整就好
void create(int len) {
    for(int i=len/2; i >= 1; i--){
        int num=i,k=i*2;
        int tmp=h[i];
        while(k <= len){
        if(k < len && h[k] > h[k+1]){
            k++;
        }
        if(h[k] >= tmp){
            break;
        }
        else{
            h[num]=h[k];
            num=k;
            k=k*2;
        }
    }
    h[num]=tmp;

 }//对于一个完全无序的数组进行调整,使得我们能进行堆排序,就是从最后一个有节点的节点往前遍历所有节点,然后依次对所有节点向下调整
上面那个数组的下标是从1开始



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值