三十天挑战数据结构(15)堆排序补充:C语言代码实现

上一篇博客里详细地展示了堆排序是怎么实现的,其实它看上去思路挺复杂但是C语言程序实现起来蛮简单。
主要是通过循环来在二叉树上不断遍历调整结点顺序,形成大顶堆(或小顶堆)并且移走已经确定位置的那个结点。

这里实现还是按照上篇博文中的大顶堆来实现:
直接放代码好了:

#include<stdio.h>
#include<stdlib.h>

void HeapSort(int *s, int length);
void HeapAdjust(int *s, int v, int length);

int main()
{
	int i;
	int s[11];
	for(i=1; i<=10; i++)
		scanf("%d", &s[i]);
	
	int length = 10;
	HeapSort(s, length);
	for(i=1; i<=10; i++)
		printf("%d ", s[i]);
		
	return 0;
}

void HeapAdjust(int *s, int v, int length)
{
	int temp, j;
	temp = s[v];
	for(j=2*v; j<=length; j*=2)
	{
		if(j<length && s[j]<s[j+1])
			j++;
		if(temp >= s[j])
			break;
		s[v] = s[j];
		v = j;
	}
	s[v] = temp;
}

void swap(int *s, int m, int n)
{
	int tmp;
	tmp = s[m];
	s[m] = s[n];
	s[n] = tmp;
}

void HeapSort(int *s, int length)
{
	int i;
	for(i=length/2; i>0; i--)
		HeapAdjust(s, i, length);
	
	for(i=length; i>1; i--)
	{
		swap(s, 1, i);
		HeapAdjust(s, 1, i-1);//此时整个数组需要遍历的长度就减少了1 
	}
}

程序运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值