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语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

    算法与数据结构 2023年5月19日
    00
  • 快速排序算法在Swift编程中的几种代码实现示例

    让我为您详细讲解“快速排序算法在Swift编程中的几种代码实现示例”的完整攻略。 快速排序算法简介 快速排序是一种常用的排序算法,其基本思想是通过一个枢轴(pivot)将待排序数组分成两个部分,一部分小于枢轴,一部分大于枢轴,然后对这两个部分进行递归排序,最终得到一个有序的数组。 快速排序算法实现 下面是三种在Swift编程中实现快速排序算法的代码示例。 代…

    算法与数据结构 2023年5月19日
    00
  • C++中的几种排序算法

    下面就C++中几种常用的排序算法进行详细的讲解。 一、冒泡排序 冒泡排序是一种基本排序算法,也是入门级别的排序算法。其基本思想就是对于一组待排序的数据,通过不断地比较相邻两个元素的大小关系,并对需要调整位置的元素进行交换,来达到排序的目的。 C++代码实现: void bubble_sort(int arr[], int n) { for (int i = …

    算法与数据结构 2023年5月19日
    00
  • JavaScript算法学习之冒泡排序和选择排序

    JavaScript算法学习之冒泡排序和选择排序 冒泡排序和选择排序是常见的两种排序算法。在本文中,我们将详细讲解这两种排序算法,并提供代码示例供读者参考。 冒泡排序 冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,依次将最大的元素冒泡到数组的末尾。 以下是冒泡排序的代码示例: function bubbleSort(array) { const…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第六天 五大经典查找【下】

    算法系列15天速成 第六天 五大经典查找【下】- 完整攻略 简介 本篇文章是算法系列15天速成中的第六天内容,主要是介绍五大经典查找的后三种查找算法:插值查找、斐波那契查找以及分块查找。在介绍每一种查找算法时都会包含具体的思路、复杂度和应用场景等内容。 插值查找 思路 插值查找是在二分查找的基础上优化的一种查找算法,它不是通过数组的中间元素进行查找,而是通过…

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

    C++选择排序算法实例详解 选择排序算法简介 选择排序是一种简单直观的排序算法,其思想是首先找到序列中的最小值,然后将其放到序列的最前面。接着,从剩余序列中找到次小值,将其放到已排序序列的末尾。以此类推,直到排序完成。 选择排序算法的时间复杂度为$O(n^2)$,空间复杂度为$O(1)$,并且由于其算法思想简单,代码实现容易,所以在实际应用中还是比较常见的排…

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

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

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现的七种排序算法总结(推荐!)

    JavaScript实现的七种排序算法总结(推荐!) 简介 本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。 插入排序 插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排…

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