C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)

C语言之数字排序

在学习C语言的时候遇到了几个比较基础的排序问题,又结合了之前的处理方法。觉得在这个需要再系统地进行复习一下。
当我们在初学C语言的时候,我们都会结合三个数字的排序来理解计算机处理问题的方式:
计算机不会像人一样直观地去判断三个数的大小,在计算机对数字比较的时候,需要对数字进行两两比较,之后才能得出一串数字的大小。
比如在对a,b,c三个数字进行比较的时候,就要分别进行两两之间的比较:

【案例一】

题目描述
本题要求将输入的任意3个整数从小到大输出。

输入
输入在一行中给出3个整数,其间以空格分隔。

输出
在一行中将3个整数从小到大输出,其间以“ ”隔开。

样例输入

4 2 8

样例输出

2 4 8

代码

#include<stdio.h>
int main()
{
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	if(a<b&&a<c){
		if(b<c)
		printf("%d %d %d",a,b,c);
		else
		printf("%d %d %d",a,c,b);
	}
	else if(b<a&&b<c){
		if(a<c)
		printf("%d %d %d",b,a,c);
		else
		printf("%d %d %d",b,c,a);
	}
	else if(c<b&&c<a){
		if(b<a)
		printf("%d %d %d",c,b,a);
		else
		printf("%d %d %d",c,a,b);
	}
}

这么一段复杂、臃肿的代码,仅仅实现了三个数字之间的比较。这算得上是一种简单粗暴的方法。虽然显得很笨重,但是却很容易让人理解,并很容易将代码实现。
但是,这样的处理方式仅仅局限于对三个数字的比较,如果再多出几位,这种方法将变得很不现实。
所以,我们需要一种更加简捷的方式去处理这个问题。
观察上述的代码,我们发现,每一次大的if语句中我们都先确定了最大的那个数,然后再进行后两位数的比较。那么,我们能不能使用一种方法,每一次将数字串的最大的一个数字选出来,放在第一位,然后不再处理这个数字,再将以后的数字进行选择,每次将最大的数字放在第一位。于是便解决了多个数字的排序问题,这个方法就叫做 冒泡排序法
【案例二】

题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入
数据有多组,对于每组数据:
输入有2行,第1行为1个正整数N,表示所生成的随机数的个数。
第2行有N个用空格隔开的正整数,为所产生的随机数。
[数据范围]
0<N<=1e5
输出
对于每组数据:
输出有2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数,末尾有一个空格。

样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400 

代码

#include<stdio.h>
int main()
{
	int n,i,j,t;
	scanf("%d",&n);
	int a[n],b[n];
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		for(j=0;j<i;j++)
			if(a[j]==a[i]){
				i--;n--;
			}
	}
	a[i]='\0';
	printf("%d\n",n);
	for(i=0;i<n;i++){
			b[i]=a[i];
		for(j=i+1;j<n;j++){
			if(a[j]<b[i]){
				t=a[j];
				a[j]=b[i];
				b[i]=t;
			}
		}
	}
	for(i=0;i<n;i++)
	printf("%d ",b[i]);
}

【案例三】
在这个案例中,本来是在输入的第一行给出相应数字的数量,但是我认为应该有一种简单的方法去实现对未知数量的数字进行排序,于是从网上找到了这个函数进行操作,效果可见一斑。
题目描述
本题要求将给定的n个整数从大到小排序后输出。

输入
输入第一行给出给出n个整数,其间以回车之外的任意符号分隔。

输出
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

样例输入

5 1 7 6

样例输出

7 6 5 1

代码

#include<stdio.h>
#include<ctype.h>
int main()
{
    int t,j,i=0,n=0,a[1000],b[1000];
    char c;
    while((c=getchar())!='\n')
    {
        if(isdigit(c))
        {
            ungetc(c,stdin);
            scanf("%d",&a[n++]);
        }
    }
    for(i=0;i<n;i++){
			b[i]=a[i];
		for(j=i+1;j<n;j++){
			if(a[j]<b[i]){
				t=a[j];
				a[j]=b[i];
				b[i]=t;
			}
		}
	}
	for(i=0;i<n;i++)
	printf("%d ",b[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值