算法搬运之堆排序

举报
DreamLife 发表于 2022/04/16 00:27:21 2022/04/16
【摘要】 思想 堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。 堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关...

思想
堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。
堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。
或者说,堆排序将所有的待排序数据分为两部分,无序区和有序区。无序区也就是前面的最大堆数据,有序区是每次将堆顶元素放到最后排列而成的序列。每一次堆排序过程都是有序区元素个数增加,无序区元素个数减少的过程。当无序区元素个数为1时,堆排序就完成了。

int adjust_heap(vector<int> &v, int length, int i){
        int left = 2 * i;
        int right = 2 * i + 1;
        int largest = i;
        int temp;

        while(left < length || right < length){
                if (left < length && v[largest] < v[left]){
                        largest = left;
                }
                if (right < length && v[largest] < v[right]){
                        largest = right;
                }

                if (i != largest){
                        temp = v[largest];
                        v[largest] = v[i];
                        v[i] = temp;
                        i = largest;
                        left = 2 * i;
                        right = 2 * i + 1;
                }
                else{
                        break;
                }
        }
}

int build_heap(vector<int> &v, int length){
        int i;
        int begin = length/2 - 1; //get the last parent node
        for (i = begin; i>=0; i--){
                adjust_heap(v,length,i);
        }
}

int heap_sort(vector<int> &v){
        int length = v.size();
        int temp;
        printline("before sort:",v);
        build_heap(v,length);
        while(length > 1){
                temp = v[length-1];
                v[length-1] = v[0];
                v[0] = temp;
                length--;
                adjust_heap(v,length,0);
        }
        printline("after sort:",v);
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

网址:http://www.cnblogs.com/luchen927/archive/2012/03/08/2381446.html

这里写图片描述

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/50969719

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。