C++堆排序算法的实现方法

C++堆排序算法的实现方法

堆排序是一种高效的排序算法,使用一定程度的空间复杂度换来更快的时间复杂度。下面将详细讲解C++中堆排序算法的实现方法。

算法实现步骤:

  1. 将待排序数组构建成一个二叉堆。
  2. 将堆顶元素与堆底元素进行交换。
  3. 对除了堆底元素以外的堆进行调整,使其重新成为一个新的堆。
  4. 重复2、3步骤,直到整个数组排序完成。

代码实现

C++中STL容器提供了优先队列(priority_queue)来实现堆(heap)。利用priority_queue就可以非常简便的实现堆排序。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

int main()
{
    priority_queue<int,vector<int>,greater<int> >heap;//建小根堆
    int ans=0;  //ans即为最终结果
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x; scanf("%d",&x);
        heap.push(x);//将元素推入堆中
    }
    while(heap.top()>=n)//top()取栈顶元素
    {
        int tmp=heap.top();//获取堆顶元素
        heap.pop();//将堆顶元素弹出
        if(tmp>=n)ans++,//该元素大于等于n时结果+1
        if(tmp%2==0)heap.push(tmp/2);
        else heap.push(tmp/2+1),heap.push(tmp/2);//该元素为奇数时分成两个元素入队
    }
    cout<<ans<<"\n";
    return 0;
}

上述代码中,通过priority_queue构建小根堆,将元素推入堆中并通过堆顶元素获取最小值。

示例演示

例如,如下对一个数组进行堆排序:

4 3 1 5 6 2

对于这个数组,通过priority_queue构建小根堆,优先队列变为:

1
2
3
4
5
6

将堆顶元素1与堆底元素6进行交换,得到:

6
2
3
4
5
1

对除了6以外的堆进行调整,使其成为新的堆,如下:

2
4
3
6
5
1

此时再将堆顶元素2与堆底元素5进行交换,得到:

5
4
3
6
2
1

再次对除了5以外的堆进行调整,得到新的堆:

3
4
1
6
2

此时再将堆顶元素3与堆底元素2进行交换,得到:

2
4
1
6
3

再次对除了2以外的堆进行调整,得到新的堆:

1
4
3
6

最后将堆顶元素1与堆底元素6进行交换,排序完成。

以上是C++中堆排序算法的实现方法及示例说明。

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

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

相关文章

  • C语言下快速排序(挖坑法)详解

    C语言下快速排序(挖坑法)详解 什么是快速排序 快速排序是将一个待排序的序列分成两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再对这两部分分别进行排序,递归执行该操作直到将整个序列排好为止。快速排序使用了分治思想。由于在每一次的递归过程中,都将待排序的序列分成两部分,因此处理的数据量不断减少,使得算法的效率比较高。 快速排序的实现 挖坑法 挖坑法…

    算法与数据结构 2023年5月19日
    00
  • 堆排序算法(选择排序改进)

    堆排序算法是一种基于二叉堆的选择排序改进算法。它利用了二叉堆的特点,可以将排序时间降至O(nlogn)级别。下面我们来详细讲解它的完整攻略。 基本思路 将待排序的序列构建成一个最大堆。 将堆顶的元素(即当前最大元素)跟数组最后一个元素交换位置,然后将剩余的元素进行堆调整,使其满足最大堆的要求。 重复步骤2,直至排序完成。 步骤详解 1. 构建最大堆 对于一个…

    算法与数据结构 2023年5月19日
    00
  • 深入理解JS实现快速排序和去重

    深入理解JS实现快速排序和去重 1.快速排序 快速排序是一种快速并且高效的排序算法。下面是快速排序的步骤: 选择数组中的中心元素作为基准点(pivot) 将所有小于基准点的元素移到基准点的左侧,所有大于基准点的元素移到基准点的右侧 对左右两个子数组递归执行步骤1和步骤2,直到子数组长度为1或0 快速排序可以用以下的JavaScript代码来实现: funct…

    算法与数据结构 2023年5月19日
    00
  • PHP中数组的三种排序方法分享

    当我们处理大量数据时,数组是非常有用的数据结构。排序是数组常见的操作之一,PHP中提供了三种常用的排序方法,分别是冒泡排序、快速排序和插入排序。接下来,本文将详细介绍这三种方法的实现过程和使用方法。 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,每次比较相邻两个元素,如果顺序不对就交换它们。这样一趟遍历后,就能把最大(或最小)的元素移到最…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数据结构与算法之二叉树添加/删除节点操作示例

    首先让我们来介绍一下“JavaScript数据结构与算法之二叉树添加/删除节点操作示例”这个主题。 主题介绍 本主题主要介绍了在 JavaScript 中对于二叉树数据结构进行添加/删除节点操作的示例代码。二叉树是一种常见的树形结构,在计算机科学领域中被广泛应用。节点的添加与删除是该数据结构中常见的操作之一,本主题将通过示例代码,为您详细介绍操作的过程。 代…

    算法与数据结构 2023年5月19日
    00
  • JS排序之冒泡排序详解

    JS排序之冒泡排序详解 简介 冒泡排序是最基本,也是最容易实现的排序算法之一。它的基本思想是通过多次循环遍历数组,每次比较相邻两个元素的大小,如果发现顺序不对,就交换它们的位置,通过多次遍历和交换的操作,最终使得整个数组变得有序。 基本思路 遍历数组,将相邻元素的大小进行比较,如果前面元素大于后面元素,则交换它们的位置; 继续以相同的方式遍历数组,直到数组中…

    算法与数据结构 2023年5月19日
    00
  • C++ 计数排序实例详解

    C++ 计数排序实例详解 简介 计数排序是一种稳定的排序算法,其时间复杂度为O(n + k),其中n为待排序序列的长度,k为序列中元素的取值范围。相比其他排序算法,计数排序的时间复杂度较小,但需要占用更多的内存空间。计数排序在排序的元素值比较小,且元素集合密集程度比较大的场景下表现更加出色。 算法原理 计数排序的基本思想是,统计待排序序列中,每个元素出现的个…

    算法与数据结构 2023年5月19日
    00
  • java冒泡排序简单实例

    下面我来详细讲解一下“Java冒泡排序简单实例”的完整攻略。 简介 冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就将它们交换过来。重复上述步骤直到整个数列都有序为止。 实现步骤 首先,我们需要定义一个整型数组,用于存储待排序的数据。 int[] array = {5, 3, 8, 6, 4}; 定义一个…

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