C++实现堆排序示例

下面就详细讲解一下“C++实现堆排序示例”的完整攻略。

什么是堆排序

堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。

实现步骤

堆排序主要有两个步骤:构建堆和调整堆。

构建堆

  • 将待排序的序列构造成一个大根堆。
  • 从最后一个非叶子节点开始从下到上,从右到左调整每个节点的位置,使其满足堆的性质。

以下是一个示例:

void MaxHeapify(int arr[], int start, int end)
{
    // 获取左右子节点的位置
    int dad = start;
    int son = dad * 2 + 1;
    while (son <= end) {
        // 如果右子节点存在且大于左子节点,则定位到右子节点
        if (son + 1 <= end && arr[son] < arr[son + 1])
            son++;
        // 如果父节点的值大于等于子节点的值,则退出
        if (arr[dad] >= arr[son])
            return;
        // 否则,交换父节点和子节点,并继续向下调整
        else {
            swap(arr[dad], arr[son]);
            dad = son;
            son = dad * 2 + 1;
        }
    }
}
void HeapSort(int arr[], int len)
{
    // 构建堆
    for (int i = len / 2 - 1; i >= 0; i--)
        MaxHeapify(arr, i, len - 1);
    // 调整堆
    for (int i = len - 1; i > 0; i--) {
        swap(arr[0], arr[i]);
        MaxHeapify(arr, 0, i - 1);
    }
}

调整堆

构建好大根堆之后,便可以调整堆进行排序了。具体步骤如下:

  • 将堆顶元素(最大值)和堆底元素交换位置,每次交换将堆的元素个数减一。
  • 对剩余的元素重新进行堆的调整,使得堆的性质得以保持。

以下是一个示例:

void MaxHeapify(int arr[], int start, int end)
{
    // 获取左右子节点的位置
    int dad = start;
    int son = dad * 2 + 1;
    while (son <= end) {
        // 如果右子节点存在且大于左子节点,则定位到右子节点
        if (son + 1 <= end && arr[son] < arr[son + 1])
            son++;
        // 如果父节点的值大于等于子节点的值,则退出
        if (arr[dad] >= arr[son])
            return;
        // 否则,交换父节点和子节点,并继续向下调整
        else {
            swap(arr[dad], arr[son]);
            dad = son;
            son = dad * 2 + 1;
        }
    }
}

void HeapSort(int arr[], int len)
{
    // 构建堆
    for (int i = len / 2 - 1; i >= 0; i--)
        MaxHeapify(arr, i, len - 1);
    // 调整堆
    for (int i = len - 1; i > 0; i--) {
        swap(arr[0], arr[i]);
        MaxHeapify(arr, 0, i - 1);
    }
}

示例

以下是一个示例说明:

int main()
{
    int n;
    cout << "请输入数组元素的个数:" << endl;
    cin >> n;
    int arr[n];
    cout << "请输入" << n << "个数字:" << endl;
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    // 利用堆排序排序
    HeapSort(arr, n);

    // 输出排序好的序列
    cout << "排序好的序列为:" << endl;
    for(int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

运行结果如下:

请输入数组元素的个数:
5
请输入5个数字:
4 5 3 2 1
排序好的序列为:
1 2 3 4 5

通过上面的示例可以看到,堆排序是一种高效的排序方法,能够快速地对待排序序列进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现堆排序示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 大数据情况下桶排序算法的运用与C++代码实现示例

    桶排序算法是一种基于计数的排序算法,它的主要思想是把一组数据分成多个桶,对每个桶中的数据进行排序,最后依次把每个桶中的数据合并起来,得到排序后的结果。在大数据情况下,桶排序算法可以大幅减少排序时间,因为它可以快速地将数据分成多个桶,进行并行排序,最终合并起来。 以下是桶排序算法在大数据情况下的运用及C++代码示例: 算法思路 先确定桶的数量,也就是需要将数据…

    算法与数据结构 2023年5月19日
    00
  • C/C++实现双路快速排序算法原理

    作为网站的作者,我很愿意为大家详细介绍C/C++实现双路快速排序算法原理。下面是详细的攻略,分为以下几个部分: 1. 什么是双路快排算法 双路快排(Dual-Pivot Quick Sort)算法是一种高效的排序算法。该算法是快速排序(Quick Sort)的一种改进。 双路快排算法的基本思想是:选取两个基准值(pivot)来进行排序,将数组划分为三部分:小…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中的冒泡排序法

    JavaScript中的冒泡排序法 冒泡排序法就是通过比较任意两个相邻的元素,然后循环遍历整个数组,逐步将最大(或最小)的数移到最后一位。当没有相邻的元素需要互换位置的时候即可完成排序。冒泡排序法是常用的简单排序算法,虽然时间复杂度比高级算法如快速排序、堆排序等要高,但是对于小的数据集合,其性能表现要好于其他排序算法。 以下是冒泡排序法的具体实现: func…

    算法与数据结构 2023年5月19日
    00
  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法详解及实例代码 本篇文章将详细讲解C语言中奇偶排序算法的原理、实现方法及具体的实例代码,并通过两个示例说明其使用方法。 原理介绍 奇偶排序算法又叫交替排序算法,是一种简单但较慢的排序算法,通常用于小型数据集中的排序。该算法通过使用两个线程分别对奇数位置和偶数位置的元素进行比较和交换来实现排序。 该算法的原理如下: 从头到尾扫描一遍待排序数组…

    算法与数据结构 2023年5月19日
    00
  • 微信红包随机生成算法php版

    下面我会详细讲解“微信红包随机生成算法php版”的完整攻略。 算法简介 微信的红包算法采用的是二倍均值法,即将总金额分成若干个等份,然后按照一定的规则分配给每个红包领取者,使得每个红包领取者所得到的金额期望相等。具体来说,就是按照以下步骤来生成红包: 首先获取红包数量和总金额。 计算出每个红包的最大金额,即 max = totalAmount / num *…

    算法与数据结构 2023年5月19日
    00
  • PHP大转盘中奖概率算法实例

    下面是一份完整的攻略,讲解如何实现一个PHP大转盘中奖概率算法: 问题描述 如何实现一个PHP大转盘中奖概率算法?也即,在一个转盘上设置几个奖项,每个奖项有对应的中奖概率,随机抽取中奖项并输出对应的奖品。 思路分析 为了实现大转盘的中奖概率算法,需要从以下几个方面入手: 定义奖项:确定奖品数量和对应的中奖概率 生成随机数:使用PHP的rand()函数生成随机…

    算法与数据结构 2023年5月19日
    00
  • PHP常用的排序和查找算法

    PHP常用的排序和查找算法 排序算法 冒泡排序 冒泡排序是一种简单的排序算法。 它多次遍历要排序的列表,每次比较相邻的两项,如果它们的顺序错误就把它们交换过来。 示例代码如下: function bubble_sort($arr) { $len = count($arr); for($i=1; $i<$len; $i++) { for($j=0; $j…

    算法与数据结构 2023年5月19日
    00
  • java排序算法图文详解

    Java排序算法图文详解 在Java编程中,排序算法是非常重要且常见的一部分。本文将详细讲解Java中的各种排序算法及其实现,帮助读者了解不同算法的特点和使用场景,提高程序的效率和可读性。 排序算法分类 在Java中,常用的排序算法主要可以分为以下几类: 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 冒泡排序 冒泡排序是一种简单的排序算法,其原理…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部