zoukankan      html  css  js  c++  java
  • C++实现堆排序

    堆排序是合并排序和插入排序排序方法共同的长处。它的时间复杂度O(nlgn),这也是一个地方排序算法:在任何时候,外阵中拥有唯一不变的输入数组存储的元素。引进第一家引进什么样的堆堆。

    1.建堆:堆数据结构是一种数组对象,它能够被视为一颗全然二叉树。例如以下图。

    右边数组表示的堆能够用左边的全然二叉树来表示。当中若父节点相应数组下标为i。则其左孩子相应数组下标为2*i。右孩子为2*i+1。



    详细代码例如以下:

    void buildMaxHeap(int a[] , int heapSize){
    for(int i = heapSize/2;i >= 1;--i)
    max_heapify(a,i,heapSize); //本行代码调用max_heapify函数来保持最大堆性质,接下来会介绍到。heapSize为堆大小。
    }

    2.保持根堆性质:接下来介绍大根堆与小根堆的差别。

    大根堆某个节点的值最多是和其父节点一样大。小根堆的组织刚好相反。在堆排序中我们使用的是大根堆。

    为了保持大根堆的性质。我们如果从下标为i的数组元素開始。将其值与它的左孩子和右孩子相比較,找出最大值相应的下标largest,如果largest恰好与i相等。则说明节点i保持了最大堆性质。

    否则交换下标为largest和i所相应的数组元素值,而且对下标为largest的元素继续进行“保持根堆性质”的操作。这么说可能有些太缺乏生动性,那么一起来看看这个过程吧:




    能够看到图中节点值为4的节点的保持根堆性质过程。代码例如以下:

    void max_heapify(int a[],int i,int heapSize){
    int lindex = 2*i,rindex = 2*i + 1,largest = 0;
    if(lindex <= heapSize && a[lindex-1] > a[i-1])//推断左孩子和节点i的值谁大。将大值得下标保存为largest
    largest = lindex;
    else
    largest = i;

    if(rindex <= heapSize && a[rindex-1] > a[largest-1])//推断右孩子和节点largest的值谁大
    largest = rindex;

    if(largest != i){//假设largest不等于i
    swap(a[i-1] , a[largest-1]);//交换
    max_heapify(a,largest,heapSize);//继续对下标为largest、大小为heapSize的节点进行“保持根堆性质”
    }
    }

    下面是swap函数:

    void swap(int& first , int& second){
    int tem = 0;
    tem = first;
    first = second;
    second = tem;
    }

    3.堆排序算法:我用一个图来直观表示吧!


    过程大致是将大根堆的根节点与最后一个叶子节点交换,然后缩小数组范围(即将heapSize减小),将最大值排除掉,最后对新的根节点进行“保持堆性质方法”。依次类推,代码例如以下:


    void heapSort(int a[] , int heapSize){
    buildMaxHeap(a , heapSize);//建堆
    for(int i = heapSize;i >= 2;--i){
    swap(a[0] , a[i-1]);//将根节点与最后的叶子节点交换
    --heapSize;//缩小堆范围
    max_heapify(a,1,heapSize);//保持堆性质

    }
    }

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    【原创】阿里云 ECS 腾讯云CVM(云服务器)网站搭建教程 + PHP+MYSQL环境搭建教程
    50+慕课收费资源下载
    王雨的jquery练习01---显示隐藏列表
    王雨的JavaScript练习06---js实现动画效果(2)
    王雨的JavaScript练习05---js实现动画效果(1)
    王雨的JavaScript练习04---DOM操作CSS
    王雨的JavaScript练习03---Ajax初体验
    王雨的JavaScript练习02---复习DOM,充实文档内容
    王雨的JavaScript练习01---js幻灯(纯手打)
    目前最高清C值解析接口!还有各类VIP接口![9.09]
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4722257.html
Copyright © 2011-2022 走看看