首页 > 编程语言 > 详细

堆排序的实现

时间:2020-03-06 09:31:27      阅读:67      评论:0      收藏:0      [点我收藏+]

  再说堆排序时,我们首先谈谈什么是大顶堆,小顶堆。

  所谓大顶堆,首先是一个二叉树。然后给个节点的左子节点和右子节点都小于他们的父节点。而小顶堆正好相反。  

  很明显拿到数据,我们首先将数据转化为大顶堆。代码:

void adjust(int arr[],int i,int length)
{
    int temp = arr[i];
    
    for(int k = 2 * i + 1; k < length; k = 2 * k + 1)
    {
        
        if(k + 1 < length && arr[k] < arr[k+1])
        {
            k++;
        } 
        if(arr[k] > temp)
        {
            arr[i] = arr[k];
            i = k;
        }else{
            
            break;
        }
        arr[i] = temp;
    }
}

  arr 就是要转化的数组。i 是你要操作的节点 length 你要操作数组的长度。

  排好后将大顶堆的根节点排到最后。这一操作肯定会打乱大顶堆。我们只需再一次转为大顶堆就ok了。代码:

void sort(int arr[],int length)
{
    for(int i = length / 2 - 1; i >= 0; i--)
    {
        adjust(arr,i,length);
    }
    
    
    for(int j = length - 1; j > 0; j--)
    {
        int temp = arr[j];
        arr[j] = arr[0];
        arr[0] = temp;
        
        adjust(arr,0,j);
    }
}

  整个过程就好了。在此说明一下:adjust 形参i 的计算方法: i = arr.length/2 -1

堆排序的实现

原文:https://www.cnblogs.com/zdybj/p/12424217.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!