首页 > 其他分享 >选择排序法——堆排序

选择排序法——堆排序

时间:2024-11-13 23:14:45浏览次数:3  
标签:int void 堆排序 heapify 选择 largest 排序

任务描述
本关任务:完成建堆、排序调整及输出排序结果的函数。

相关知识
为了既要保存中间比较结果,减少后面的比较次数,又不占用大量的附加存储空间,使选择排序算法具有较好的性能,Willioms和Floyd在1964年提出的称为堆排序的算法实现了这一想法。 

堆排序包括以下关键部分:
1.建初始堆;
2.输出堆顶元素后,调整堆。
重复2,直到排序完成。

若需要对数据进行从小到大的递增排序,则应建立大顶(根)堆。

#include <stdio.h>
#define MAXSIZE 100

void print(int a[], int n) {
    for (int i = 1; i <= n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void heapify(int a[], int n, int i) {
    int largest = i;
    int left = 2 * i;
    int right = 2 * i + 1;

    if (left <= n && a[left] > a[largest])
        largest = left;

    if (right <= n && a[right] > a[largest])
        largest = right;

    if (largest != i) {
        swap(&a[i], &a[largest]);
        heapify(a, n, largest);
    }
}

void heapSort(int a[], int n) {
    // Build heap (rearrange array)
    for (int i = n / 2; i >= 1; i--)
        heapify(a, n, i);

    // One by one extract an element from heap
    for (int i = n; i >= 1; i--) {
        // Move current root to end
        swap(&a[1], &a[i]);

        // call max heapify on the reduced heap
        heapify(a, i - 1, 1);
    }
}

int main(void) {
    int num;
    scanf("%d", &num);
    int data[MAXSIZE];

    for (int i = 1; i <= num; i++) {
        scanf("%d", &data[i]);
    }

    heapSort(data, num);
    print(data, num); // 输出排序后的数组

    return 0;
}

标签:int,void,堆排序,heapify,选择,largest,排序
From: https://blog.csdn.net/lightfuturezyx99/article/details/143754950

相关文章

  • idea新建工程只能选择高版本的,1.8的sdk用不了
    现象 :打开idea,File->NewProject选择springinitializr,选择jdk1.8,选择java21,点击下一步报错:ErrorSelectedverssionofJava17isnotsupportedbytheprojectSDK'1.8'.打开创建工程网址:https://start.spring.io/java只有17,21,23,确实不支持低版本的jdk了 不推荐......
  • 11.13机器学习_KNN和模型选择调优
    7特征降维实际数据中,有时候特征很多,会增加计算量,降维就是去掉一些特征,或者转化多个特征为少量个特征特征降维其目的:是减少数据集的维度,同时尽可能保留数据的重要信息。特征降维的好处:减少计算成本:在高维空间中处理数据可能非常耗时且计算密集。降维可以简化模型,......
  • Hive的分区和排序
    一、Hive的分区(十分重要)1、分区是什么答:我们可以把一个大的文件分隔成一个个小的文件,这样每次操作一个小文件就很方便了2、为什么要进行分区答:通过分区,当我们查询的时候,可以只扫描与条件相关的分区,这样做,避免了全局扫描,加快查询速度1、静态分区(SP)静态分区指的是,在我们将数......
  • javascript如何进行冒泡排序?
    冒泡排序的规律有一个数组[5,4,3,2,1],假如说要重新排序,进行升序排序,冒泡排序步骤如下5和4比较,5大,5和4交换位置[4,5,3,2,1]5和3比较,5大,5和3交换位置[4,3,5,2,1]5和2比较,5大。5和2交换位置[4,3,2,5,1]5和1比较,5大,5和1交换位置[4,3,2,1,5]5排到了最后一位4开始和后面的......
  • 华为云前台展示镜像供用户选择是怎么做到的呢?
    前台展示的各种公共镜像是管理员在后台传上去的;如何做到?在ServiceOM界面管理员可操做,制作镜像有两种方式:1.qcow2格式镜像制作2.iso格式镜像制作上传ISO文件,安装OS,安装cloud-init等,转换为镜像2.1.注册镜像-管理镜像磁盘设备类型:linux系统选virtio,windows系统选scsi......
  • LIBS元素谱线选择
    激光诱导击穿光谱(LIBS)是一种快速、无损的元素分析技术,在科研和工业中应用广泛。然而,面对复杂的元素谱线,如何精准选取合适的谱线始终是LIBS分析中的难题。专为LIBS用户设计的元素谱线选线软件,通过其强大的智能算法和高效的用户界面,提供了一站式的谱线选择解决方案,为研究人员和工程......
  • 空气开关(空气断路器)根据额定电流的不同,可以选择不同规格的开关。家用230V电路中,常见的
    空气开关(空气断路器)根据额定电流的不同,可以选择不同规格的开关。家用230V电路中,常见的额定电流规格有6A、10A、16A、20A、25A、32A、40A、50A、63A等。这些规格的空气开关主要区别在于它们适应的电流负荷大小,从而保护不同功率的家用电器和电路。以下是这些常见规格的比较表格:......
  • 瓷砖的规格种类非常多,适用于不同场景和用途。常见的规格通常按尺寸、材质、功能和安装
    瓷砖的规格种类非常多,适用于不同场景和用途。常见的规格通常按尺寸、材质、功能和安装方式等进行分类。下面是一些常见瓷砖规格及其施工建议的对比表格,帮助选择适合的规格和施工人数。瓷砖规格与施工建议规格/尺寸(mm)适用场景常见材质适用类型施工人数建议优点缺点......
  • 室内PPR水管与室外PPR水管的区别主要体现在材料选择、耐候性、安装方式以及使用环境等
    室内PPR水管与室外PPR水管的区别主要体现在材料选择、耐候性、安装方式以及使用环境等方面。PPR(聚丙烯随机共聚物)水管作为一种广泛应用于家装和建筑工程中的管材,具有耐腐蚀、耐高温、无毒环保等优点。然而,由于室内和室外的环境和使用要求不同,PPR水管在设计和生产时会有所区别。1.......
  • MapReduce初级编程实践:编写程序实现对输入文件的排序
     实验环境:操作系统:Linux(Centos7);  Xsell7Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两......