2021.11.10 4洛谷三位数排序——c语言

题目描述

给出三个整数 a,b,c,a,b,c(0≤a,b,c≤100),要求把这三位整数从小到大排序。

输入格式

输出格式

输入输出样例

输入 

1 14 5

输出 

1 5 14

输入 

2 2 2

输出 

2 2 2

这道题真的非常值得研究

这里我会提供两种解法,希望所有看过这篇文章的人能看得懂这两种,第2种和排序有关,希望能看懂

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void change(int* a, int* b) {
	int num;
	num = *a;
	*a = *b;
	*b = num;
}
int main() {
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	if (a > b) {
		change(&a, &b);
		if (b > c) {
			change(&b, &c);
			if (a > b) {
				change(&a, &b);
			}
		}
	}
	else if (a < b) {
		if (b > c) {
			change(&c, &b);
			if (a > b) {
				change(&a, &b);
			}
		}
	}
	printf("%d %d %d", a, b, c);
return 0;
}

看着很长,实际上不是很难。这里用到了指针传参。这里稍作简单的解释。因为一个变量的声明周期就是两个{}花括号,所以如果想通过一个函数将其中的变量的值传给main函数,那么这时候就需要用到指针。

这里的change函数就是用到了指针传参。交换两个变量。

现在来分析一下main函数

从a>b和a<b开始逐层分析,两两进行判断,如果前面的数比后面的大就进行交换最后使a , b ,c依次从小到大排列。

是不是有人觉得这样太麻烦了。两个两个进行判断,不仅费脑子而且费手。接下来要讲的就是冒泡排序,将这三个数存入一个数组,再进行排序。

上代码

#include <stdio.h>
int main() {
	int i, j, k,num;
	int arr[10] = {0};
	for (num = 0; num < 3; num++) {
		scanf("%d",&arr[num]);
	}
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 3-i-1; j++) {
			if (arr[j] > arr[j + 1]) {
				k = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = k;

			}
		}
	}
	for (i = 0; i < 3; i++) {
		printf("%d ", arr[i]);
	}
}

这里先用for循环将三个数字存入arr这个数组,那么来仔细讲讲这个思路。

原理和上述的比大小是一样的。

a先和b,c比较找出最小的再赋值给a(这里是进行两次比较)

b和c比较,比较小的再赋值给b,最后最小的就是c,这样三个数字就一次按照由小到大进行好了比较与赋值

这里是需要用到两个for循环,第一个外层循环表示有多少个数字需要比较,应该为n-1(这里为2)

第二个内层循环是一个数字进行的比较,应该进行n-1-i(这里为1)

最后打印就行了

因为打印的是数组,所以又需要一个for循环进行输出

第二种方法有些难度,不过希望读者能够理解,这比较符合对后续的数据结构与算法的思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值