qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

#include <stdio.h>

/*遍历*/
void tranvase(int * arr, int len){
    int i;
    for(i=1; i<=len; i++){
        printf("%d、", arr[i]);
    }
    printf("\n");
}

/*调整堆*/
void tiaozhengdui(int * arr, int root, int end){ //root 为根坐标 end为最后元素坐标
    int j;
    j = 2*root; //root的左子树
    int temp = arr[root]; //临时保存根节点值
    /*比较左子树值和右子树值*/
    if((j+1)<=end && arr[j]<arr[j+1]){
        j=j+1;
    }
    //j 指向子树最大值的位置
    // 继续比较 该最大值 和 它的 子树值进行比较
    while(j<=end){
        if(temp<arr[j]){ //根节点值<子树最大值  互换值
                arr[root] = arr[j];
                root = j;
                j = 2*j;
                 /*比较左子树值和右子树值*/
                if((j+1)<=end && arr[j]<arr[j+1]){
                    j=j+1;
                }
        }else{
            j = end+1; //退出
        }
    }
    arr[root] = temp;
}

/*堆排序*/
void stackSort(int * arr, int len){
        int i,j,temp;
        //初始化堆
        for(i=len/2; i>=1; i--){
            tiaozhengdui(arr, i, len);
        }

        /*换根和最后元素的值*/
        for(j=len; j>=2; j--){
             temp = arr[1]; //临时存储根节点最大值
             arr[1] = arr[len]; //根节点保存最后一个结点的值
             arr[len]=temp; //最后一个结点保存最大值
             len = len-1;
             tiaozhengdui(arr, 1, len); //继续调整堆
    }
}

int main(){
    int arr[10] = { 0, 12, 1, 33, 23, 23, 4, 2, 445, 2};
    tranvase(arr, 9);
    stackSort(arr, 9);
    tranvase(arr, 9);
    return 0;
}

posted on 2012-11-07 00:18  qintangtao  阅读(716)  评论(0编辑  收藏  举报