复试算法练习Day15——输入n个整数,输出其中最小的k个

复试算法练习Day15——输入n个整数,输出其中最小的k个

描述

输入n个整数,找出其中最小的k个整数并按升序输出

本题有多组输入样例

数据范围:1 \le n \le 1000 \1≤n≤1000 ,输入的整数满足 1 \le val \le 10000 \1≤val≤10000

输入描述:

第一行输入两个整数n和k
第二行输入一个整数数组

输出描述:

从小到大输出最小的k个整数,用空格分开。

示例1

输入:

5 2
1 3 5 7 2

输出:

1 2

思路

思路一:本题通过借助冒泡排序,将n个数放在一个定义的数组中,对其进行排序,就可以输出前k个较小的数。因为定义了数组大小,设置变量赋值后自减即可得到结果。

具体实现

//采用冒泡排序实现输入n个整数,
//找出其中最小的k个整数并按升序输出
#include <stdio.h>

int main(){
	int n;
	int k;
	//输入k和n的值
    
	scanf ("%d %d",&n,&k);
    //采用的测试数组要足够大,否则产生数组越界错误
	int arr[100000];
	int i = 0;
    //将n赋值给m,当m大于0时,用m自减1就可以得到这n个数
	int m = n;
	while (m > 0){
		//输入每个需要输出的n个数的值
		scanf ("%d",&arr[i]);
		//m自减得到n个数
        m--;
		i++;
	}
	
	int j;
    //设置指针来执行冒泡排序
	int temp;
	for (i = 0; i < n-1; i++){
		for (j = 0; j < n-i-1; j++){
			if (a[j] > a[j+1]){
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
    
    //排好序之后,输出需要输出已排序后的前n个数
	for (i = 0; i < k; i++){
		printf ("%d ",a[i]);
	}
	printf ("\n");
	return 0;
}

时间复杂度

首先定义了输出数组的第k个数需要的数组是排好序的,因此采用冒泡排序算法排序后输出,在遍历数组的时候采用了两次for循环,给出数组的顺序排列,所以时间复杂度为O(n^2),然后输出为一个数组,因此空间复杂度也为O(1)

小结

本题主要思路是首先快速排序,可以采用插入排序,快速排序,或者堆排序,在利用C语言来编写排序算法代码的时候采用时间复杂度低一些的算法在对于数组数目不多的情况下更好用,如果数组数量巨大,应该采用快速排序来确定数组方法,从而快速输出结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值