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

    堆排序(HeapSort)

      堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(left,right)的值,所以,根节点的值最大,类似最小值堆则相反。

    代码如下:

    void HeapSort(int *A, int n){
      BulidMaxHeap(A,n);
      for(int i = n-1; i>=1; i--){
        Exchange(A[0],A[i]);
    heapsize[A]--; MaxHeapify(A,
    0); } } void BuildMaxHeap(int *A){ for(int i = heapsize[A]/2; i>=0; i--){ MaxHeapify(A, i); } } void MaxHeapify(int *A, int k){ int l = k*2; int r = k*2 + 1; int largest; if(l < heapsize[A] && A[l] > A[k]){ largest = l; }else{ largest = k; } if(r < heapsize[A] && A[largest] < A[r]){ largest = r; } if(largest != k){ Exchange(A[largest], A[k]); MaxHeapify(A, largest); } } void Exchange(int &i, int &j){ i = i + j; j = i - j; i = i - j; }

      代码中主要有3个函数HeapSort,BuildMaxHeap,MaxHeapify。

      1.MaxHeapify(int *A, int k)

      该函数主要功能:检测堆A中的第k个元素A[k]是否满足最大值堆的性质(父节点A[k]大于子节点),如果不满足则进行调整至所有节点均满足该性质为止。

      2.BuildMaxHeap(int *A)

      该函数主要功能:简历一个最大值堆

      3.HeapSort(int *A, int n)

      该函数主要功能:对一个最大值堆进行排序,大致过程:首先将堆的根节点和最后一个节点交换,这样根节点就破换了最大值堆的性质,然后对交换后的堆的根节点进行调整MaxHeapify(A, 0);依次调用该过程。

      由于每次交换值的时候根节点是堆的最大值,所以第一次调整是将堆的最大值放到数组的最后,第二次调整时将堆的第二大值放到数组的倒数第二的位置,以此类推。

      代码中heapsize[A] 代表的是堆的长度,每交换一次值后,堆的长度减一。

     

    P.S:

      以上代码为伪代码,其中heapsize[A]的操作没用定义。要将代码移植到C/C++平台上,可以将heapsize定义为全局变量,或者多为数组A开辟一个空间,用来存放heapsize。

     

  • 相关阅读:
    day06
    day05
    day04
    day03
    day02
    day01
    斯坦福大学Machine Learning中文笔记目录
    张志华 机器学习 两门课程正确顺序及视频连接
    ROS:No module named 'em' 解决方法
    获取windows文件夹目录
  • 原文地址:https://www.cnblogs.com/suiyu/p/2956122.html
Copyright © 2011-2022 走看看