C++实现堆排序示例

yizhihongxing

下面就详细讲解一下“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日

相关文章

  • Lua中写排序算法实例(选择排序算法)

    让我为您详细讲解一下Lua中写排序算法实例(选择排序算法)的完整攻略。 什么是选择排序算法 选择排序是一种简单直观的排序算法,它的工作原理如下: 在待排序的数组中找到最小元素; 将其存放到数组的起始位置; 在剩余未排序的元素中继续寻找最小值,并放到已排序序列的末尾; 重复步骤3,直到待排序序列中的所有元素均已排序完毕。 选择排序的实现思路简单,但由于每次都要…

    算法与数据结构 2023年5月19日
    00
  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    冒泡排序算法(Bubble Sort) 冒泡排序算法是比较简单的排序算法之一,它通过多次比较和交换相邻两个元素的位置,将整个序列逐步变得有序,因此也被称为“泡沫排序”。 算法步骤: 从序列的第一个元素开始,与第二个元素进行比较,如果第一个元素大于第二个元素,则交换这两个元素; 接着再与第三个元素进行比较,如果第二个元素大于第三个元素,则交换这两个元素; 以此…

    算法与数据结构 2023年5月19日
    00
  • 必须知道的C语言八大排序算法(收藏)

    必须知道的C语言八大排序算法(收藏) 简介 排序算法(sorting algorithms)是计算机程序设计中处理数据的重要技术之一,常见于数据处理程序中。其功能是按照指定的方式将所输入的数据进行排序。排序算法分为内部排序和外部排序,本文主要讲解C语言中的八大内部排序算法。 八大排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计…

    算法与数据结构 2023年5月19日
    00
  • c++ 快速排序算法【过程图解】

    C++ 快速排序算法【过程图解】 快速排序是一种常用的排序算法,其基本原理是通过分治的思想将待排序序列分成若干子序列,使得每个子序列都是有序的。具体实现时,首先选择一定的元素作为基准值,然后将比基准值小的元素全部放在基准值的左边,比基准值大的元素全部放在基准值的右边,这样就将序列分成了分别包含较小元素和较大元素的两个子序列。然后,递归地对子序列进行排序,最终…

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

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

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

    C/C++实现快速排序算法的思路及原理解析 快速排序算法是一种高效的排序算法,它的平均时间复杂度是 O(nlogn),最坏情况下的时间复杂度是 O(n^2)。快速排序算法的核心思想是分治法,通过不断将原问题分解成规模更小的子问题来实现排序。本文将详细讲解 C/C++ 实现快速排序算法的思路及原理解析,包括实现过程和两个示例说明。 快速排序算法实现原理 快速排…

    算法与数据结构 2023年5月19日
    00
  • Java实现插入排序,希尔排序和归并排序

    Java实现插入排序、希尔排序和归并排序 插入排序 插入排序算法的思路是:将一个待排序的数组(序列)分为两部分,前面的有序序列和后面的无序序列,将无序序列中的每一个元素插到有序序列中的适当位置,直到无序序列为空。 Java代码实现: public static void insertionSort(int[] arr) { int i, j, temp; f…

    算法与数据结构 2023年5月19日
    00
  • 详解go语言中sort如何排序

    下面是关于”go语言中sort如何排序”的详细讲解。 sort 包简介 sort 包是 Go 语言标准库中的一个包,主要提供排序的功能,使用方便,可以满足我们日常开发中各种排序需求。sort 包中提供的排序方法有: sort.Slice sort.SliceStable sort.Sort sort.Stable sort.Slice sort.Slice …

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