堆,大根堆,堆排序。

堆排序与大根堆
最后的备注自己瞎加的,往前辈和大神不吝赐教,多多指出问题,提出意见或建议。
代码改自左神。
纯C代码,编辑器:Code::Blocks 16.01
这是我在CSDN的第①篇博客,继续努力吧。

#include <stdio.h>
#include <stdlib.h>

//形成大根堆的代价是log1+log2+log3+....+logn-1==>O(n)

void swap(int *arr,int a,int b){
    int temp;
    temp = *(arr+a);
    *(arr+a) = *(arr+b);
    *(arr+b) = temp;
}

//建立大根堆使用 while终止条件(-1)/2=0

void heapinsert(int arr[],int index){
    while(arr[index]>arr[(index-1)/2]){
        swap(arr,index,(index-1)/2);
        index = (index-1)/2;
    }
}

//heapify表示从0到heapsize-1已经形成了大根堆,在往后就越界,index为变化的值的位置
//堆中一个值变化后,重新调整的过程

void heapify(int arr[],int index,int heapsize){
    int leftson = index * 2 + 1;
    int largest;
    while(leftson<heapsize){
        largest=(leftson+1<heapsize)&&(arr[leftson+1]>arr[leftson])?(leftson+1):leftson;
        largest = (arr[largest]>arr[index])?largest:index;
        if(largest == index){
            break;
        }
        swap(arr,largest,index);  // largest != index
        index = largest;
        leftson = index * 2 + 1;
    }
}

void heapsort(int arr[],int len){
    int i;
    int heapsize;
    if(len<2)
        return;
    for(i=0;i<len;i++){
        heapinsert(arr,i);
    }

    heapsize = len;
    swap(arr,0,--heapsize);
    while(heapsize>0){
        heapify(arr,0,heapsize);
        swap(arr,0,--heapsize);
    }
}

int main()
{
    int i;
    int arr [] = {1,2,3,4,5,9,8,7,6,0};
    heapsort(arr,10);
    for(i=0;i<10;i++){
        printf("%d ",arr[i]);
    }
    return 0;
}
/**
    备注与想法:如果要向大根堆中插入一个值,请将这个值和根结点比较,
    如果这个值大于根节点,将这个值放在根节点的位置,将原来根节点放
    在末尾,如果调用heapinsert这个函数来进行调整。
    如果这个值比根节点小,则直接放到末尾,调用heapinsert来调整。
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值