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。

     

  • 相关阅读:
    subsonic资源聚合
    一些经典的框架
    小毛看传统图书行业
    商界传媒20092010 从容就业,激情创业(企业家走进北在)活动记
    Beijing Perl Workshop 2009
    智力更生小毛笔记&心得
    使用world 2007 或是windows live writer写blog的设置
    php技术准备
    我需要知道的技术常识
    重新分配ip
  • 原文地址:https://www.cnblogs.com/suiyu/p/2956122.html
Copyright © 2011-2022 走看看