码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构::堆排序

时间:2020-06-13 17:13:18      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:parent   数据结构   个数   sizeof   for   换行   堆排序   创建   bsp   

数据结构::堆排序

#include <stdio.h>

void swap(int array[],int x,int y){
    int key;
    key=array[x];
    array[x]=array[y];
    array[y]=key;
}

//从大到小排序 
//void Down(int array[],int i,int n){
//    int child=2*i+1;
//    int key=array[i];
//    while (child<n){
//        if (array[child]>array[child+1] && child+1<n) {
//            child++;
//        }
//        if (key>array[child]){
//            swap(array, i, child);
//            i=child;
//        }
//        else{
//            break;
//        }
//        child=child*2+1;
//    }
//}

//从小到大排序
void Down(int array[],int i,int n){                        //最后结果就是大顶堆 
    int parent=i;                                        //父节点下标
    int child=2*i+1;                                    //子节点下标  
    while (child<n){
        if (array[child]<array[child+1] && child+1<n) {    //判断子节点那个大,大的与父节点比较 
            child++;
        }
        
        if (array[parent]<array[child]){                //判断父节点是否小于子节点 
            swap(array, parent, child);                    //交换父节点和子节点 
            parent=child;                                //子节点下标 赋给 父节点下标 
        }

        child=child*2+1;                                //换行,比较下面的父节点和子节点 
    }
}

void BuildHeap(int array[],int size)
{
   int i=0;                                                //倒数第二排开始 
   for(i=size/2-1;i>=0;i--){                            //创建大顶堆,必须从下往上比较 
      Down(array,i,size);                                //否则有的不符合大顶堆定义 
      }
}

void heapSort(int array[],int size){
    BuildHeap(array,size);                                //初始化堆 
    printf("初始化数组:");
    for(int i=0;i<size;i++){
        printf("%d ",array[i]);
    }
    printf("\n");
    
    for(int i=size-1;i>0;i--)
    {    
        swap(array,0,i);                                //交换顶点和第 i 个数据 
        //因为只有array[0]改变,其它都符合大顶堆的定义,所以可以从上往下重新建立 
        Down(array,0,i);                                //重新建立大顶堆 
        
        printf("排序的数组:");
        for(int i=0;i<size;i++){
            printf("%d ",array[i]);
        }
        printf("\n");
    }
}

int main(){
    int array[]={49,38,65,97,76,13,27,49,10};
    int size= sizeof(array) / sizeof(int);
    printf("%d \n",size);
    printf("排序前数组:");
        for(int i=0;i<size;i++){
            printf("%d ",array[i]);
        }
    printf("\n");
    heapSort(array,size);
    
    return 0;
}

 

数据结构::堆排序

标签:parent   数据结构   个数   sizeof   for   换行   堆排序   创建   bsp   

原文地址:https://www.cnblogs.com/a-hua/p/13118233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!