C语言 取一个无序整数集合中第5小的数

137 阅读1分钟

说明:

集合:可以是静态数组也可以是动态链表,按需调整; 前置条件:默认输入的数组长度大于等于5,其他情况按需设计处置方法;

基本逻辑说明:

本文使用静态数组的方式计算;

基本逻辑为按顺序读取输入集合的数值,并填入一个长度为5(或者指定最大长度为5,而数组实际长度大于5都行)的整型数组;

如果读取的数值为大的数,则填入静态数组的高位,小的数则填入静态数组的低位;

静态数组作为一个类队列的结构存在,如果填入数值超过5则会舍弃,按从小到大排列,舍弃高位的大数;

由于队列运算载体为静态数组,每次填入新数都可能产生大量重赋值操作,所以实际运算的时间复杂度偏高,因此本文只提供思路,不做性能优化;

代码:

所需函数和定义:

#include <malloc.h>

#define MAX_SIZE 5

void addNum(int v); int getMin5(int* inArr, int len);

函数实现:

#include "MyList.h"

int gl_Queue[5] = { 0 }; int maxNum = 0;

void addNum(int v) {

int index = 0;
int i = 0;
if (maxNum == 0) {
	gl_Queue[0] = v;
	maxNum++;
	return;
}
for (index = 0; index < MAX_SIZE; index++) {
	if (gl_Queue[index] >= v) {
		for (i = MAX_SIZE - 1; i >= index; i--) {
			gl_Queue[i] = gl_Queue[i - 1];
		}
		gl_Queue[index] = v;
		maxNum++;
		return;
	}
}
if (maxNum < 5) {
	for (i = 0;;i++) {
		if (i == maxNum) {
			gl_Queue[i] = v;
			maxNum++;
			return;
		}
	}
}
else {
	return;
}

}

int getMin5(int* inArr, int len) {

int i = 0;
for (i = 0; i < len; i++) {
	addNum(inArr[i]);
}

return gl_Queue[4];

}