zoukankan      html  css  js  c++  java
  • 算法搬运之堆排序

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

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

    这里写图片描述

  • 相关阅读:
    Live2d Test Env
    Live2d Test Env
    Live2d Test Env
    图神经网络入门
    CommandLineRunner 可能会导致你的应用宕机停止,我劝你耗子尾汁
    不使用 MQ 如何实现 pub/sub 场景?
    为什么 @Value 可以获取配置中心的值?
    vite + ts 快速搭建 vue3 项目 以及介绍相关特性
    给 Mac 添加右键菜单「使用 VSCode 打开」
    【Python】连接常用数据库
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160143.html
Copyright © 2011-2022 走看看