算法 寻找第K小元素
Input:
3
I 10
I 10
I 9
O
I 8
I 7
O
S
Output:
10
9
issue
算法是边输入边处理结果,得保证排序算法时间复杂度低,否则会造成超时。
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 1024
int result[MAXLEN];
int a[MAXLEN];
char str[MAXLEN][MAXLEN] = { '0' };
void swap(int* value1, int* value2)
{
int temp = *value1;
*value1 = *value2;
*value2 = temp;
}
int selectSortSearch(int array[], int size, int k)
{
int minIndex;
int i = 0;
int j = 0;
for (i = 0; i < k; ++i) {
minIndex = i;
for (j = i + 1; j < size; ++j) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
swap(&array[i], &array[minIndex]);
}
return array[k - 1];
// printf("find: %d\n", array[k - 1]);
}
int main()
{
int k, i = 0, j = 0,x = 0;
int num;
char* re = NULL;
scanf_s("%d", &k);
getchar();
//先排序再取第K小元素
while (gets(str[x]) != NULL)
{
if (str[x][0] == 'I')
{
re = strtok(str[x]," ");
re = strtok(NULL, " ");
num = atoi(re);//分割并转化为数字
a[i] = num;
++i;
++x;
continue;
}
if (str[x][0] == 'O')
{
result[j] = selectSortSearch(a, i, k);//选择排序
++j;
++x;
continue;
}
if (str[x][0] == 'S')
{
break;
}
}
for (int c = 0; c < j; ++c)
{
printf("%d\n", result[c]);
}
return 0;
}