首页 > 其他分享 >8644 堆排序

8644 堆排序

时间:2024-06-07 12:29:34浏览次数:12  
标签:temp parent int max 堆排序 print 8644 节点

Description

用函数实现堆排序,并输出每趟排序的结果

输入格式

第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据

输出格式

第一行:初始建堆后的结果
其后各行输出交换堆顶元素并调整堆的结果,数据之间用一个空格分隔

输入样例

10
5 4 8 0 9 3 2 6 7 1

输出样例

9 7 8 6 4 3 2 5 0 1        
8 7 3 6 4 1 2 5 0 9
7 6 3 5 4 1 2 0 8 9
6 5 3 0 4 1 2 7 8 9
5 4 3 0 2 1 6 7 8 9
4 2 3 0 1 5 6 7 8 9
3 2 1 0 4 5 6 7 8 9
2 0 1 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
#include<stdio.h>

int a[1000], n;
//从下标为1开始存储
void print() {
    for(int i = 1; i <= n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

void heapadjust(int parent,int N) {
    int max, lchild, rchild;
    lchild = 2 * parent;//左孩子
    while(lchild<=N)//左孩子等于N时也能进循环,否则会少判断只有一个左孩子的情况
    {
        max=lchild;//先让最大值下标为左孩子
        rchild = lchild + 1;//右孩子
        if(rchild<=N && a[lchild]<a[rchild])//如果右孩子存在,比较左右孩子
        {
            max=rchild;//max的值是左右孩子中大的那个
        }
        if(a[parent]>a[max])//如果父节点比孩子节点最大的那个大
        {
            return ;//不用调整,下一个
        }
        else        //否则
        {
            int temp=a[parent];//交换父节点和大的那个孩子节点
            a[parent]=a[max];
            a[max]=temp;
            parent=max;//如果大孩子也有孩子,原父节点换到这里后可能不符合大根堆,需要循环继续调整
            lchild=parent*2;//大孩子的左孩子下标(如果<=N才能继续循环)
        }
    }
}
// 初始化大顶堆
void heapsort() {
    for(int i = n / 2; i >= 1; i--) { //下标1开始存储的最后一个非叶子结点为n/2
        heapadjust(i,n);
    }
    print();

    for(int i = n; i > 1; i--) {//注意循环的条件是i>1,i=1时就剩一个了,不用再调
        int temp = a[1];
        a[1] = a[i];
        a[i] = temp; // 交换
        heapadjust(1,i-1); // 调整堆的时候只用从根节点开始,因为交换第一个和最后一个不影响其他
        print();
    }
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <=n; i++) {
        scanf("%d", &a[i]);
    }
    heapsort();
    return 0;
}

这个题主要是注意heapadjust函数怎么写

标签:temp,parent,int,max,堆排序,print,8644,节点
From: https://blog.csdn.net/Caitlin_lee_/article/details/139522838

相关文章

  • 堆排序-java
    这次主要讲了堆排序和堆的基本构造,下一期会详细讲述堆的各种基本操作。文章目录前言一、堆排序1.题目描述2.堆二、算法思路1.堆的存储2.结点下移down3.结点上移up4.堆的基本操作5.堆的初始化三、代码如下1.代码如下:2.读入数据:3.代码运行结果总结前言......
  • [排序算法]选择排序+堆排序全梳理!
    目录前言1.直接选择排序基本思想具体步骤:动图演示代码实现直接选择特性总结:2.堆排序向下调整算法任意树调整为堆的思想堆排序堆排序的基本思想:动图演示选择排序的特性总结:3.总结前言今天我们将学习排序算法中的直接选择排序和堆排序,它们的基本思想都是每一......
  • 堆排序(Heap sort)
    堆排序堆排序是简单选择排序的改进,改进点为如何让减少在选择的过程中比较的次数。1.堆的定义    堆是具有以下性质的完全二叉树:每个结点的值都大于(小于)等于其孩子节点的值,称为大根堆(小根堆)。例:   由堆的定义得知堆顶元素一定为最大(大根堆)或者最小值(小根堆)。......
  • 七大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序、快速排序
    以下内容转载自文章1.插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元......
  • (Java)数据结构——排序(第一节)堆排序+PTA L2-012 关于堆的判断
    前言本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。堆排序(HeapSort)概念堆排序是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆),重复......
  • 【数据结构与算法】:堆排序和选择排序
    1.堆排序堆排序是一种比较复杂的排序算法,因为它的流程比较多,理解起来不会像冒泡排序和选择排序那样直观。1.1堆的结构要理解堆排序,首先要理解堆。堆的逻辑结构是一棵完全二叉树,物理结构是一个数组。(如果不知道什么是二叉树,请前往我的主页查看)。所以堆是一个用数组表......
  • 堆排序算法
    问题描述现有一组数据:23,45,18,11,13,79,72,25,3,17。请使用快速排序算法将它们按照从小到大的顺序排列。算法思想(1)将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;(2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(3)重新调整结构,使其满足堆定义,然后继续......
  • 九、算法-排序-堆排序
    常见六大排序:冒泡、选择、插入、快速、归并、堆。在了解堆排序之前,需要了解数据结构-二叉树的知识。二叉树:树中的每个节点下最多只有两个叶子节点;根节点:二叉树的首个节点;叶子节点:非根的节点;父节点-子节点:父节点下方归属的为子节点,是相对而言的关系,在顺序存储的数据结构里......
  • 【算法】堆排序
    完全二叉树在学习堆排序之前,我们先对完全二叉树有一个基本的了解。构建过程:数据从上到下,从左到右依次进行构建。我们给出以下数据 我们构建出以下完全二叉树我们观察每个节点的下标,会发现以下规律。 N[i]的左子树:N[2i+1] N[i]的右子树:N[2i+2] N[i]的父节点:N......
  • 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度
    看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客前言:相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期自己写的程序或者是做到哪个需要判断时间复杂度的题时,仍然判断不出来时间复杂度是多少,今......