堆排序(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;

    }

}

 

 

转载于:https://www.cnblogs.com/Kellana/p/5831298.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值