zoukankan      html  css  js  c++  java
  • 堆排序(HEAPSORT)

    堆排序是利用”堆“的数据特性来进行数据管理。首先说一下什么是堆,堆的本质是经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为最小堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为最大堆。

    堆排序的最坏的运行时间是O(nlgn).

    要用堆排序,首先要知道最大堆,最小堆,最大堆满足A[PARENT(i)]>=A(i),最小堆满足A[PARENT(i)]<=A(i);

    MAX-HEAPIFY代码如下:

    首先parent(i)=floor(1/2); left=2*i+1;right=2*(i+1);

    第二步,要建立堆,用自底向上的方法利用过程,首先通过最大堆把一个数组转化为最大堆,代码如下:

    初始化中,第一次迭代前,i=floor(i/2),而floor(i/2)+1 ... n都是叶子节点,因此是最大堆的根节点。

    最后就是排序了;

    最后贴一下全部的代码:

    void max_heapSize(int * arr,int i,int heapSize){

        int left =2*i+1;

        int right = 2*i+2;

        int largest = i;

        if (left<=heapSize && arr[left]>arr[i]){

            largest =left;

        }

        if(right<=heapSize && arr[right]>arr[largest]) {

            largest=right;

        }

        if (largest != i && right<=heapSize){

            int temp =arr[i];

            arr[i] = arr[largest];

            arr[largest] = temp;

            max_heapSize(arr,largest,heapSize);

        }

    }

     

    void buid_heap(int *arr,int length,int heapSize){

        for(int i=floor(length/2);i>=0;i--){

            max_heapSize(arr,i,heapSize);

        }

    }

     

    void heap_sort(int *arr,int length,int heapSize){

        buid_heap(arr,length,heapSize);

        for (int i=heapSize;i>0;i--){

            int tep=arr[i];

            arr[i]=arr[0];

            arr[0]=tep;

            heapSize=heapSize-1;

            max_heapSize(arr, 0,heapSize);

        }

    }

     

    int main(){

        int arr[10]={16,14,10,8,7,9,3,2,29,22};

        heap_sort(arr,10,10);

        for (int r=0;r<10;r++){

            std::cout<<arr[r]<<std::endl;

        }

    }

     

  • 相关阅读:
    一些信息熵的含义
    scikit-learn包的学习资料
    DB Scan算法的分析与实现
    ps教程连接
    用PS如何把图片调出时尚杂志色
    Linux FIFO读写时堵塞与非堵塞的效果
    yuyv转yuv420p代码及验证代码
    YUV格式介绍
    too many include files depth = 1024错误原因
    开发用小工具
  • 原文地址:https://www.cnblogs.com/Kellana/p/5831298.html
Copyright © 2011-2022 走看看