简单选择排序和堆排序

本文展示了如何使用C语言实现简单选择排序和堆排序算法。首先,详细解释了简单选择排序的过程,然后通过代码实现了一个升序排列的数组。接着,介绍了堆排序的原理,包括构建大顶堆和排序过程,并提供了相应的代码实现。这些排序算法对于理解数据结构和算法具有基础性意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>

int main()
{    
	int nums1[10] = { 0,8,6,3,9,7,5,4,2,1 };//nums1[0]为哨兵
	int i, j;
	
	printf(">>简单选择排序:  ");

	int max, temp;
	for (i = 1; i <= 8; i++)//nums1[1]~nums1[9]
	{
		max = i;
		for (j = i + 1; j <= 9; j++) {
			if (nums1[max] < nums1[j]) {
				max = j;
			}
		}
		if (i != max) {
			temp = nums1[max];
			nums1[max] = nums1[i];
			nums1[i] = temp;
		}

	}

	for (i = 1; i <= 9; i++) {
		printf("%d  ", nums1[i]);
	}

	
	int nums2[10] = { 0,8,6,3,9,7,5,4,2,1 };//nums2[0]为哨兵
	printf("\n>>堆排序:");
    
    void HeapAdjust(int* nums2, int a, int b);
	void Swap(int* nums2, int a, int b);
	int Length = 9;
	//先构成大顶堆(每个父结点比子结点大)
	for (i = Length / 2; i >= 1; i--) {//遍历所有有孩子的父结点
		HeapAdjust(nums2, i, Length );
	}
	//排序
	for (i = Length; i > 1; i--) {
		Swap(nums2, i, 1);
		HeapAdjust(nums2, 1, i - 1);
	}

	for (i = 1; i <= 9; i++) {
		printf("%d  ", nums1[i]);
	}
}

void Swap(int* nums2, int a, int b)
{
	int temp;
	temp = nums2[a];
	nums2[a] = nums2[b];
	nums2[b] = temp;
}

void HeapAdjust(int* nums2, int a, int b) 
{
	int j;//j为父结点的两个子结点
	int temp = nums2[a];

	for (j = a * 2; j <= b; j *= 2) {
		if (j < b && nums2[j] < nums2[j + 1])
			j = j + 1;//选出左右孩子中最大的孩子
		if (nums2[j] <= temp) 
			break;//如果父结点比最大子结点大,则不必交换
		nums2[a] = nums2[j];//反之,交换
		a = j;//a变成下一个父结点
	}

	nums2[a] = temp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值