堆排序(Heap_sort)

2024-06-09 22:28
文章标签 heap 堆排序 sort

本文主要是介绍堆排序(Heap_sort),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

涉及到大根堆的知识点;

最小父节点为length/2-1

父节点的子节点为son = dad*2+1 或  dad*2+2

大根堆即所有父节点大于所有子节点

主要函数:

void Heap_Sort(int *a,int length)
{int i;//从最小的父亲节开始改变,使每一个父亲节点大于儿子节点,从而构成大根堆for(int i = length/2-1;i >=0 ;--i){Heap(a,i,length);}//排序完成后最开始的节点一定是最大的,因为是大根堆swap(a[0],a[length-1]);for(int i = length-1;i > 1;--i){Heap(a,0,i);//因为大根堆父亲节点大于所有子节点,所以排序一次即可swap(a[0],a[i-1]);}
}

先将无序数组转换为大根堆

然后将首节点与最后节点交换,因为大根堆的头节点最大,这时候最末尾元素就是最大的了

然后在用heap一次即可找打剩余最大的数字持续交换直到剩下最后一个元素即可

次要函数:

//使每个父亲节点大于儿子节点
void Heap(int *a,int dad,int length)
{int son = dad*2+1;while(son < length){if(son+1<length && a[son] < a[son+1])//保证儿子节点是两个儿子中最大的{++son;}if(a[dad] < a[son]){swap(a[dad],a[son]);}dad = son;son = dad*2+1;}
}

该函数只能使一个头节点的元素最大,需要从最小的父节点进行循环,因为如果从下往上的话最大的数传播不上去;在主函数后续只需要排序一次是因为:只有头节点不满足大根堆,相当于第一次的最后一步,也就是排序最后一个头节点,因此只需要排序一次即可构成大根堆;

c++代码如下:

#include <bits/stdc++.h>using namespace std;void swap(int &a,int &b)
{int t = a;a = b;b = t;
}//使每个父亲节点大于儿子节点
void Heap(int *a,int dad,int length)
{int son = dad*2+1;while(son < length){if(son+1<length && a[son] < a[son+1])//保证儿子节点是两个儿子中最大的{++son;}if(a[dad] < a[son]){swap(a[dad],a[son]);}dad = son;son = dad*2+1;}
}void Heap_Sort(int *a,int length)
{int i;//从最小的父亲节开始改变,使每一个父亲节点大于儿子节点,从而构成大根堆for(int i = length/2-1;i >=0 ;--i){Heap(a,i,length);}//排序完成后最开始的节点一定是最大的,因为是大根堆swap(a[0],a[length-1]);for(int i = length-1;i > 1;--i){Heap(a,0,i);//因为大根堆父亲节点大于所有子节点,所以排序一次即可swap(a[0],a[i-1]);}
}void print_arr(int *arr,int size)
{for(int i = 0;i < size;++i){cout << arr[i];if(i != size-1){cout << " ";}}
}int main()
{int n;cin >> n;int arr[n];for(int i = 0;i < n;++i){cin >> arr[i];}Heap_Sort(arr,n);print_arr(arr,n);cout << endl;
}

这篇关于堆排序(Heap_sort)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046470

相关文章

常用命令: sort学习笔记

本文的sort命令是GNU版本(8.22), 和BSD的sort不同 sort是我最常用Linux命令之一,它的功能就是排序,一般后面还会和uniq搭配,对数据进行去重。 下面的操作假设你有一个文件,叫做chr.txt, 内容如下, 不同列之间用制表符分隔 Chr3 20251812 20254323 +Chr1 471971 473336 -Chr3

堆排序(第6章)

根据《算法导论》第6章堆排序算法编写,程序可运行。 #include <STDIO.H>#include <STDLIB.H>#include <MATH.H>/*求父节点的下标*/int PARENT(int i){double a=i/2.0;return (int)ceil(a)-1; }/*求左孩子的下标*/int LEFT(int i){return 2*i+1;

理解堆排序

堆排序(Heapsort)是一种基于堆这种数据结构的排序算法,但在实际实现中,堆通常是用数组来表示的。这种方法充分利用了数组的特性,使得堆的操作更加高效。下面通过详细解释和举例说明来帮助理解这种排序方式。 堆的数组表示 一个堆是一种完全二叉树,可以通过数组方便地表示: 对于一个节点在数组中的索引i: 它的左子节点的索引是 2*i + 1它的右子节点的索引是 2*i + 2其父节点的索引是 (

常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序

时间复杂度O(n^2) 1、插入排序 (Insertion Sort)         从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤,直到找到已排序的元素小于或者等于新元素的位置;将新元素插入到该位置后。 void insertionSort(int arr[], int n)

[Codeforces 451B] Sort the Array (实现)

Codeforces - 451B 给定一个序列,其中每个数都不相同 问是否能在翻转其中一段后,整个序列变得单调递增 实现题 首先设一个 B B数组为 AA数组排序后的结果 由于只能翻转一个区间,那么我假装 A是满足要求的 找到最小的 A[l]≠B[l] A[l] \ne B[l],最大的 A[r]≠B[r] A[r] \ne B[r], 翻转的区间将会是 [l,r

【数据结构】堆的实现和堆排序--TOP-K问题

前言: 堆是一种特殊的树形数据结构,常用于实现优先队列和堆排序。它基于完全二叉树,通常用数组表示。主要操作包括插入(通过上滤维护堆性质)和删除(通常删除堆顶元素,通过下滤恢复堆性质)。 堆排序是一种基于堆的排序算法。它首先将待排序序列构造成一个堆,然后不断将堆顶元素与末尾元素交换并重新调整堆,直至整个序列有序。堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。 在信息过载的时代,如

【LeetCode】Sort Colors 数组排序

题目:Sort color <span style="font-size:18px;">/*LeetCode sort colors题目:输入一个数组,包含0,1,2分别代表红白蓝三种颜色,要求按照0,1,2的顺序,将同类颜色的连续排列思路:计数排序,是一个遍历两遍的方法:可以先统计每种的数量,之后直接将这一范围内的所有值都赋值为相应的数字即可遍历一遍的话可以在遍历的同时分别与0

构建gradle缓慢或内存溢出Gradle expiring daemon because jvm heap space is exhausted

项目大的时候gradle构建特别慢或者最后内存溢出,报错Gradle expiring daemon because jvm heap space is exhausted 解决此问题,在工程目录下创建gradle.properties文件,如下图: 在其中调整JVM的大小,并开启多线程并行构建功能 #===========编译设置===============##开启线程守护,第一

(直接)插入排序INSERT_SORT

一、伪代码 /*INSERT_SORT(A)*/for j = 2 to A.lengthkey = A[j]//Insert A[j] into the sorted sequence A[1..j-1].i = j-1while i>0 and A[i]>keyA[i+1] = A[i]i = i-1A[i+1] = key 二、算法描述 数组A[1..n]是一个包含n个元素

Mongodb UPDATE使用$sort将数组重新排序

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第74篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。 本文继续探讨对文档数组类型字段进行更新。可以思考平时是否遇到这样的需求。数据插入数组字段后,需要对数组字段进行排序。比如找出昨天温度最高的几个城市,或者