题目描述
给出三个整数 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循环进行输出
第二种方法有些难度,不过希望读者能够理解,这比较符合对后续的数据结构与算法的思想