数据结构::堆排序

Posted a-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构::堆排序相关的知识,希望对你有一定的参考价值。

数据结构::堆排序

#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("
");
    
    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("
");
    }
}

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

 

以上是关于数据结构::堆排序的主要内容,如果未能解决你的问题,请参考以下文章

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

一文带你了解堆排序

堆排序代码

堆排序-代码版

[ 数据结构 -- 手撕排序算法第七篇 ] 堆及其堆排序

106,排序-堆排序