复试算法练习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语言来编写排序算法代码的时候采用时间复杂度低一些的算法在对于数组数目不多的情况下更好用,如果数组数量巨大,应该采用快速排序来确定数组方法,从而快速输出结果。