美文网首页
堆与堆排序

堆与堆排序

作者: 狗尾巴草败了 | 来源:发表于2017-09-03 23:02 被阅读0次

堆是具有下列性质的完全二叉树
每个节点的值都大于或等于左右孩子节点的值,称为大顶堆
每个节点的值都小于或等于左右孩子节点的值,称为小顶堆

堆排序

堆排序的思想是首先构建一个大顶堆(从小到大排列),然后将根节点的值移除,该根节点值就是序列最大值,然后重建调整成一个大顶堆,再次将根节点移除,该根节点即为第二大值,循环往复,就能形成一个有序序列了。
代码实现:

#include <iostream>

using namespace std;

void adustHeap(int* arr, int low, int high) {
    int big = arr[low];
    for(int i = 2*low + 1; i <= high; i = 2*i + 1){
        if((i < high) && (arr[i] < arr[i+1]))
            ++i;
        if(big > arr[i])
            break;
        arr[low] = arr[i];
        low = i;
    }
    arr[low] = big;
}

void heap_sort(int* arr, int length){
    if(arr == NULL || length <= 0) {
        return;
    }
    for(int i = length/2 - 1; i >= 0; --i){
        adustHeap(arr, i, length-1);
    }
    for(int j = length-1; j > 0; --j){
        swap(arr[0], arr[j]);
        adustHeap(arr, 0, j-1);
    }
}
int main() {
    int arr[10] = {8, 3, 9, 0, 2, 4, 6, 1, 7, 5};
    heap_sort(arr, 10);
    for(int i = 0; i < 10; ++i)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

相关文章

  • 堆与堆排序

    鸣谢:https://www.cnblogs.com/chengxiao/p/6129630.htmlhttps:...

  • 堆与堆排序

    因为堆(二叉堆)是一个完全二叉树,所以一般使用数组来存放 堆的性质 一句话来说就是父节点比子节点的数据要小(小顶堆...

  • 堆与堆排序

    堆 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于左右孩子节点的值,称为大顶堆;每个节点的值都小于或等于左...

  • 堆与堆排序

    姓名:毛浩 学号:17029250003 【嵌牛导读】一道力扣题。 【嵌牛鼻子】力扣 【嵌牛提问】如何解决同位...

  • 堆与堆排序

    堆(大顶堆)的概念 堆是一种特殊的二叉树,大顶堆就是根节点为最大值的堆,它具有如下的特点: 堆是完全二叉树 堆常用...

  • 3.2-选择排序-堆排序

    参考链接 选择排序:堆排序(Heap Sort) 白话经典算法系列之七 堆与堆排序 堆排序与快速排序,归并排序一样...

  • 排序_堆与堆排序

    与简单选择排序的关系 简单选择排序过程有这个问题:在待排序的n个记录中选择一个最小的记录需要比较n-1次。这样的操...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 3.11 堆的概念及堆排序思路

    Chapter3: 更好的查找与排序算法 11. 堆的概念及堆排序 [1] 图解排序算法(三)之堆排序 讲得很好,...

  • 堆排序的实现

    用大顶堆实现堆排序

网友评论

      本文标题:堆与堆排序

      本文链接:https://www.haomeiwen.com/subject/otnjjxtx.html