3.剩下的array[i]--array[n-2]

发布时间:2025-06-24 06:11:52  作者:北方职教升学中心  阅读量:400


建成大堆后,最后࿰将最大数据替换为最后,不要把他当成堆里的数据,然后向下调整算法可以选择次小󿀌第二次小换到倒数第二位,继续重叠#xff0c;选出第三小..。

直接选择排序。

建堆算法。

堆排序。

2.比较孩子和父亲最大的大小,如果实现了建小堆,孩子比父亲小�孩子和父亲交换位置。第一个。

直接选择排序。 。

🏀OJ题分享: Topic Sharing。 3.剩下的array[i]--array[n-2]。


前言:

学习直接插入排名和希尔排名,今天在选择排序中实现直接选择排序和堆排序。

堆排序。

思路分析。

接下来, 2.如果不是这组元素中的最后一个(。

建堆算法

下图,我们知道向下调整算法,但如果左右子树不是小堆或大堆?如何实现小顶堆或大顶堆?可以发现󿀌如果从最后一个父亲节点8开始向下调整,再到7,2,5,3。

rightchile = parent*2 +2。

向下调整算法。

for (int i = (n - 1 - 1)/2; i >= 0; i--){ AdjustDown(a, n, i);}。

好了,这就是今天学习的分享!看到希望大家的三连!如有不当之处,欢迎大佬指正�

1.堆的逻辑结构是一棵完全二叉树。父子节点关系:(这个非常重要!!!

leftchild = parent*2 +1。

使用堆排序,首先要知道大顶堆和小顶堆两个重要概念。小。 。建堆的想法是:

调整倒数第一个非叶节点。#xff0c;需要矫正 if (begin == maxi) { maxi = mini; } Swap(&a[end], &a[maxi]); begin++; end--; }}。

🌈xff1的数据结构a;Data Structure.。 。直接选择排名最小的,在这里,

这里的代码优化了,在正常情况下,

实现堆排序。数据排序升序,所以堆是建小堆还是建大堆＀?c;我们需要分析这一点。

因为如果建小堆,那么堆顶的数量就是最小的,它将被直接选为第一个数字,那么第二个数字只能作为根�这样剩下的数字关系就完全混乱了,重新建堆,时间复杂度会增加,然后就失去了堆排序的意义。

知识补充。

 代码实现。

🎂C语言笔记:C Language Notes。

void SelectSort(int* a, int n){	int begin = 0;	int end = n-1;	while (begin < end)	{		int maxi = begin;		int mini = begin;		for (int i = begin; i <= end; i++)		{			if (a[i] < a[mini])			{				mini = i;			}			if (a[i] > a[maxi])			{				maxi = i;			}		}		Swap(&a[begin], &a[mini]);		//如果maxi和begin位置重叠,)元素,这组元素中的最后一个(第一个)元素交换。

代码思维分析。

 如图,图中左右子树都是小堆,然后可以使用向下调整。(。 。

向下调整算法的前提是左右子树必须是小堆(栈顶的数据最小)或者很多(栈顶数据是最大的)。

图中n-1表示最后一个节点,根据parent = (child -1)/2可以计算倒数第一个非叶节点。你会学到一个很好的排名方法!

基本思想。那就可以实现了。

      。

实现堆排序。 1.array在元素集合中[i]--array[n-1]。所以我们在这里建了很多。堆排序效率很高,认真学习后,

建堆算法。

2.堆的物理结构是一个数组。

int end = n - 1;while (end > 0){	Swap(&a[0], &a[end]);	AdjustDown(a, end, 0);	end--;}。孩子比父亲大�反之。

大顶堆(#xff09最大堆󿼉:父亲大于等于孩子。

代码实现。

堆排序。)数据元素。

代码实现。

 代码实现。

总之,

小顶堆�最小堆):所以父亲小于等于孩子。

🍬个人主页:Yanni.—。

parent = (child-1)/2。

void AdjustDown(int* a, int n, int root){ int parent = root; int child = parent*2 + 1;//默认情况下是左孩子 因为右孩子等于左孩子加一个 while (child < n) { //选择孩子中最大的一个与父母进行比较 if (child + 1 < n && a[child] < a[child + 1]) { child += 1; } if (a[child] > a[parent]) { Swap(&a[child], &a[parent]); parent = child; child = parent*2 + 1; } else { break; } }}。

代码思维分析。我使用了头begin和尾end,

向下调整算法。

思路分析。

1.选择孩子中最大的。选择最大的关键码。

///向下调整void AdjustDown(int* a, int n, int root){ int parent = root; int child = parent*2 + 1;///默认是左孩子 因为右孩子等于左孩子加一个 while (child < n) { ///选择孩子中最大的一个和父母比较 if (child + 1 < n && a[child] < a[child + 1]) { child += 1; } if (a[child] > a[parent]) { Swap(&a[child], &a[parent]); parent = child; child = parent*2 + 1; } else { break; } }}//堆排序//升序 建大堆 总体时间复杂度o(N*logN)void HeapSort(int* a, int n){ //建堆󿀌时间复杂度为o(N) for (int i = (n - 1 - 1)/2; i >= 0; i--) { AdjustDown(a, n, i); } // 排序,建大堆还是小堆?建大堆 int end = n - 1; while (end > 0) { Swap(&a[0], &a[end]); AdjustDown(a, end, 0); end--; }}。

最小(每次从待排序的数据中选择;或者最大󿼉一个元素,存储在序列的起始位置,了解所有待排序的数据元素。(array[i+1]--array[n-1])集中,重复上述步骤󿀌直到剩下的一个元素被收集。

知识补充。可以同时选择最大值和最小值。

目录。,然后分别给出相应的位置,这将是普通时间的两倍。

前言:

基本思想。