【C语言】对输入的若干个数去重并排序的算法

        已知某个用户随意输入了n个数,我们需要对这n个数去重还要进行从小到大的排序,我们该怎么办呢?

        我们分析一下这个问题,排序就不说了,任意一种排序算法都可以完成,关键就在于去重,这个该怎么办?

        要先好好想想,是先去重再排序,还是先排序再去重?如果是前者,你会发现这个去重的工程量是非常大的,因为重复的数不在一块儿,程序需要通过遍历来慢慢找。那如果是后者,你就会发现去重的工程量会大大减小,因为先经过了排序之后,所有数都按照从小到大的顺序排列好了,重复的数都挨在一块儿,你只需要判断前一个数和后一个数是否相同就可以得出是否是重复数了。

        好,有了这个思路,那么就开始上代码了。这里我用的是DevC++编写的代码,如果你用其它的编译器来进行编译出错的话,主要就是main函数的写法规范不同,简单修改一下就可以正常运行了。

#include<stdio.h>
#define N(x) x 
/*这上面宏定义了一个带参数
   的常量,后面需要用它来 
   给数组确定长度 
 */ 
main()
{
	/*定义一个n用来储存数组长度 
	  定义一个t作为冒泡排序的交换量
	  定义i和j来作为循环控制变量 
	*/ 
	int n,t,i,j; 
	scanf("%d",&n); //输入随机数的个数
	int a[N(n)]; //定义数组 ,确定长度为n 
	//输入n个随机数 
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	//冒泡排序,将数组按照从小到大的顺序排列
	for(i=0;i<n;i++){
		for(j=0;j<n-i-1;j++){
			if(a[j]>a[j+1]){
				t=a[j+1];
				a[j+1]=a[j];
				a[j]=t;
			}
		}
	}
	
	int num;//定义一个num变量来储存数组中第一次出现的数
	/*这一步是输出去重后的结果 
	*/ 
	for(i=0;i<n;i++){
		/*
		如果数组下标是0,那么就
		直接记录a[0]的值并输出。 
		*/ 
		if(i==0){
			num=a[0];
			printf("%d ",num);
		}else{
			/*如果a[i]的值等于num的值,
			说明是重复的,则跳过本次循
			环;如果不相等,就说明a[i]
			的值是第一次出现,那么就记录
			下a[i]的值,并输出num 
			*/ 
			if(a[i]==num){
				continue;
			}else{
				num=a[i];
				printf("%d ",num);
			}
		}
	} 
} 

        如果懒得写代码,没关系,我们来看看测试结果。

再试一次看看

 

 可以看到这样不仅实现了排序,还实现了去重。

另外注明一下哈,这是我自己想到的算法,代码都是按照自己的思路来写的,,肯定会有其它更佳的算法,因此我的算法仅供参考。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君莫愁。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值