C--四种排序方法的补充

上一篇文章因为时间原因只写了三种,这一篇来补充第四种,第四种的代码更多,所需要理解的也是更多的。

堆排序

想要学会堆排序,你必须了解二叉树的内容。堆排序的排序速度也是非常的快。

这里都已大堆为例

1.向上调整算法(此代码适合大堆)

/*向上调整算法*/
void xiangshang(int *a,int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[parent] < a[child])
		{
			int c;
			c = a[parent];
			a[parent] = a[child];
			a[child] = c;
		}
		/*else
		{
			break;
		}*/
		child = parent;
		parent = (child - 1) / 2;
	}
}

(想要不屏蔽掉这个else的前提是这个二叉树已经建好了大堆,否则会出现错误。)

我们可以通过这个图来理解(这里我已经建好了大堆)

【应该知道的小常识:父亲节点=(子节点-1)/2】

这里我在最后插入了11,那么11就会与他的父亲节点也就是6进行比较,如果子节点比父亲节点大的话,就会进行交换,一直到父亲节点比11大或者11一直交换到根才停止。

while循环的结束条件是child>0的原因:假设你插入的数字会一直比较到根节点,并且比根节点还大,那么在最后一次循环开始,parent是为0的,而child为1或2,那么在这次循环结束后child会变成0,parent也为0,没有比较的必要了。

这里可能有人写child>=0,这个也是成立的,只不过他的退出循环是因为else来退出的循环

当然你要进行堆排序的时候就别写这个了

2.建堆

cpp 复制代码
/*建堆*/
void jiandui(int *b,int n)
{
	for (int i = 0; i < n; i++)
	{
		xiangshang(b, i);
	}
}

这里我运用循环,你每次传一个数值,我便通过一次向上调整来形成大堆

3.向下调整算法

cpp 复制代码
/*向下调整算法*/
void xiangxia(int* a,int n,int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		if ((child + 1) < n && a[child + 1] > a[child])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			int c;
			c = a[child];
			a[child] = a[parent];
			a[parent] = c;
		}
		parent = child;
		child = parent * 2 + 1;
	}
}

【需要记住中左child=2*parent+1,右child=2*parent+2】

在这里我先假设child为左边的,让左右孩子比较,这是如果右边大,child++会使得child为右孩子。在与父亲比较进行比较。

4.堆排序

cpp 复制代码
void duipaixu(int* a, int n)
{
	int end = n-1;
	jiandui(a, n);
	while (end)
	{
		int c;
		c = a[0];
		a[0] = a[end];
		a[end] = c;
		end--;
		xiangxia(a, end, 0);
	}
	
}

我先通过jiandui函数来建立大堆,这样 便是最大的值 ,让最后一个叶子节点进行交换,这时最后一个是最大的值,让end--,是为了不让下面代码的向下调整算法对我刚调整的最大值改变位置,然后用向下调整算法找到第二大的数放在了根的位置,然后交换位置后,倒数第二个便是倒数第二个最大的,依次进行,那么在数组中就会形成升序。

相关推荐
lulu_gh_yu17 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>2 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev3 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding3 小时前
力扣1 两数之和
数据结构·算法·leetcode
南宫生4 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
weixin_432702265 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7676 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒7 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~7 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德7 小时前
多项式加法——C语言
数据结构·c++·算法