`

求n个数中前m个大的数的堆排序版本

 
阅读更多

堆排序就是先求出最大的数,然后求出次大的数,然后求出第三大的数,依次类推,而这个题只要求求出前m个大的数,所以用堆排序应该是效率比较高的。

 

heapsort()
{
       build_max_heap(int n);   //建立最大堆
       for (i=n;i>=2;i--)
       {
                 exchange(a[1],a[i]);   // 交换第一个数和堆中的最后一个数,此时最大的数就成堆的最后一个数
                  heapsize--;
                  max_heapify(1);   //保持最大堆
       }
}

 

 

 

具体代码:

 

#include<stdio.h>
#define MAXLENGTH 1000002
int a[MAXLENGTH];
int heapsize;
int m;

void exchange(int &a,int &b)
{
    int t;
    t=a;
    a=b;
    b=t;
}
int parent(int i)
{
    return i>>1;
}

int left(int i)
{
    return i<<1;
}

int rigth(int i)
{
    return (i<<1)+1;
}

void max_heapify(int i)
{
    int l=left(i);
    int r=rigth(i);
    int largest;
    if (l<=heapsize && a[l]>a[i])
        largest = l;
    else
        largest = i;
    if (r<=heapsize && a[r]>a[largest])
        largest = r;
    if (largest!=i)
    {
        exchange(a[i],a[largest]);
        max_heapify(largest);
    }
}

void build_max_heap(int n)
{
    int i;
    heapsize=n;
    for (i=n/2;i>=1;i--)
        max_heapify(i);
}

void heapsort(int n)
{
    int i;
    build_max_heap(n);
    printf("%d",a[1]);
    m--;
    for (i=n;i>=1;i--)
    {    
        if (m==0)
            break;
        printf(" ");
        exchange(a[1],a[i]);
        heapsize--;
        max_heapify(1);
        printf("%d",a[1]);
        m--;
    }
}


int main()
{
    int i,n;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for (i=1;i<=n;i++)
            scanf("%d",a+i);
        heapsort(n);
        printf("\n");
    }
    //for (i=1;i<=n;i++)
        //printf("%d ",a[i]);
    return 0;
}

 

分享到:
评论

相关推荐

    堆排序--大顶堆排序

    大顶堆排序的时间复杂度为 O(n log n),其中 n 是数组的元素个数。 空间复杂度 大顶堆排序的空间复杂度为 O(1),因为只需要使用一个临时变量来保存当前节点的值。 优点 大顶堆排序的优点是时间复杂度较低,能够...

    在一堆数中取得前K个最大最小的数的方法

    ### 在一堆数中取得前K个最大最小的数的方法 #### 概述 在计算机科学领域,特别是数据处理和分析方面,“找到一组数中的前K个最大或最小的数”是一个常见而又重要的问题。这类问题不仅在日常开发工作中频繁出现,...

    堆排序 数据结构 C语言

    堆排序的时间复杂度为 O(nlogn),其中 n 是数组的长度。空间复杂度为 O(1),因为它是原地排序算法,不需要额外的存储空间。堆排序是一种不稳定的排序算法,即相等的元素可能会改变其在最终排序结果中的相对位置。 ...

    堆排序与直接插入排序算法的比较

    算法时间复杂度 O(nlog n),堆排序的最坏时间复杂度为 O(nlog2n),堆排序的平均性能较接近于最坏性能。 3.2 系统设计 抽象数据类型定义:ADT OrderableList,包含 InsertSort、HeapAdjust、HeapSort、SetSeqList ...

    MoreWindows白话经典算法之七大排序

    冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...

    华为OD机试C卷- 最大N个数与最小N个数的和(Java & JS & Python).md-私信看全套OD代码及解析

    Java 版本的解决方案利用了 `HashSet` 来去重,并且使用了两个 `PriorityQueue` 分别作为最大堆和最小堆来存储最大和最小的 N 个数。具体实现代码如下: ```java import java.util.*; public class MaxMinNSum { ...

    最大堆实现排序(从大到小输出)

    在深入了解最大堆排序之前,我们首先需要了解几个基本的概念。 **堆**:堆是一种特殊的完全二叉树形式的数据结构,在这种结构中,对于每一个节点,其值都大于等于(最大堆)或小于等于(最小堆)它的子节点的值。...

    兰州大学数据结构实验全集 数据结构 链表 约瑟夫问题 KMP 模式匹配 二叉排序树 llink-rlink 关键路径 堆排序

    假设n个人围成一圈,从某人开始按顺时针方向报数,每数到m的人将被剔除,直到只剩最后一个人。约瑟夫问题要求找出最后幸存者的位置。 3. **KMP模式匹配**:KMP算法是一种在文本串中查找子串的高效算法,避免了不必...

    一个组合数问题(递归完成)

    例如,在计算机科学中,组合数出现在许多算法和数据结构中,如二项堆、二项队列和组合排序。了解递归和动态规划等方法来计算组合数是解决此类问题的基础,也是提升编程能力的重要一环。 总之,组合数问题是数学与...

    数据结构-3期(KC002) 堆排序算法.docx

    在实际应用中,堆排序的时间复杂度为O(n log n),空间复杂度为O(1),因为它是原地排序算法,不需要额外的存储空间。由于其性能和简单性,堆排序在各种排序算法中占有重要地位,尤其适用于大型数据集。不过,需要注意...

    几种排序法(直接选择、直接插入、快速、堆、希尔)比较

    堆排序首先建立一个大顶堆,此时最大的元素就是数组的第一个元素,然后将其与最后一个元素交换,当前数组末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次大值。如此反复执行,便能得到...

    c语言各种排序

    堆排序的时间复杂度为O(n log n)。 #### 五、归并排序 **定义:** 归并排序也是一种基于分治法的排序算法,它将待排序序列分成两半,递归地对每一半排序,然后将两个已排序的子序列合并成一个最终的有序序列。 **...

    直接插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、二路归并排序

    堆排序的过程是首先将数组构造成一个堆,然后逐步取出堆顶元素放入有序数组的末尾。 #### 代码实现 堆排序的伪代码实现如下: ```cpp void Heapify(int arr[], int n, int i) { int largest = i; int l = 2 * i +...

    直接插入,冒泡,快速,直接选择,堆,希尔 排序c代码

    根据给定文件的信息,我们可以总结出以下几种排序算法的相关知识点:直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序以及希尔排序。这些排序算法都是在计算机科学领域非常基础且重要的算法,每种排序算法都...

    八大排序算法代码(C++)

    C++中堆排序的实现: ```cpp void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left &lt; n && arr[left] &gt; arr[largest]) largest = left; if ...

    八大排序算法总结

    堆排序可以分为建堆和排序两个阶段。在排序阶段,将堆顶元素与堆的最后一个元素交换,再重新调整成堆,依次类推,直到排序完成。 - **要点**: - 构建大根堆或小根堆; - 交换堆顶元素与最后一个元素; - 调整堆...

    将两个有序数组,合并成另一个有序的数组,升序

    此外,它也经常被用于优先队列和堆排序算法中,用于在不同优先级的数据合并时保持数据的有序性。在数据处理系统中,对于需要排序和合并大量数据的场景,这种算法同样能够发挥重要作用。 综上所述,将两个有序数组合...

    上海电机学院C语言实训答案

    一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。...

    比较常用的排序算法

    7)堆排序:堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 8)基数排序:将所有待比较数值(正整数)...

    经典排序代码实现及分析

    本文主要讨论了八大经典排序算法,包括冒泡排序、基数排序和桶排序,同时也提及了快速排序和堆排序。 **桶排序(Bucket Sort)** 是一种基于分布式排序的算法,适用于数据均匀分布的情况。它假设输入数据服从均匀分布...

Global site tag (gtag.js) - Google Analytics