C语言冒泡排序

输入:

第一行:输入n,k

n表示有n个数字,而k表示第k个数。

第二行:依次输入n个数

输出:

第一行:从小到大排序好的n个数

第二行:排序中的第k个数

我们用数组解决这个问题。

#include <stdio.h>
int main()
{
  int a[100];
  int n,k,i,m,c,temp;
  scanf("%d %d",&n,&k);//n代表n个数,k代表第k个数
  for(i=0;i<n;i++) {
	scanf("%d",&a[i]);//依次输入n个数
	}
  for(m=0;m<n-1;m++){
		
	for(i=0;i<n-1-m;i++){
		if(a[i]>a[i+1]){
			temp=a[i];
			a[i]=a[i+1];
			a[i+1]=temp;
		}
	 }
  }
   for(c=0;c<n;c++){
	 printf("%d ",a[c]);//打印出从小到大排序好的n个数
	}
   printf("\n");//跳行 
   printf("%d",a[k-1]);//打印出排序的第k个数
   return 0; 
 } 

      看似复杂,实则简单。

      刚开始思考时,可以先思考怎么比较两个数。第一个和第二个比较,小的变成第一个,大的继续和第三个比较,依次比较下去……自然而然,就有了if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;},有一层for循环控制。

       但是如果只用了一次循环,显然并不能完全解决问题。

       如果输入的是5 1 2 3 4,确实可以得到1 2 3 4 5,解决问题;但是如果输入的是5 4 2 1 3,得到的会是4 2 1 3 5,也就是说,一次循环仅仅能使第一个数和其他数进行大小比较。

       于是,我们必须思考,怎样使其他数可以进行比较。拿上一个例子看,5 4 2 1 3,一次循环比较后,变成4 2 1 3 5,4变成了第一个数,如果再进行一次一样的循环比较,就可以实现4和其他数的比较,变成2 1 3 4 5,此时2又成了第一个数,再进行一次循环,成1 2 3 4 5……

       也就是说,只要实现多次循环就行了,也就是套嵌循环。外循环中,m<n-1,是因为倒数第二个数完全没必要再进行一次循环比较,内循环中i<n-1-m,有不需要再和之前循环比较已经排在后面的数进行比较的意思。

        至于打印出排序的第k个数,这一个可有可无啦,只是我遇到的题考察了,就顺带写一写了。

        本此讲解的是从小到大排序,从大到小排序与之有相似的思路啦。欢迎大家一起学习讨论,共同进步。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值