选择问题
给定N个组,确定第K个最大值
稍微好一点的算法可以先把前K个元素读人数组并(以递减的顺序)
对其排序。接着,将剩下的元素再逐个读人。当新元素被读到时,如果它小于数组中的第个元素则忽略,否则就将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组。当算法终止时,位于第K个位置上的元素
作为答案返回。
#include<stdio.h>
int main(int argc, char const *argv[])
{
//利用好一点的方法解决选择问题
int arr[]={ 9, 1, 7, 1, 6, 2, 11, 10};
int arrsize = sizeof(arr)/sizeof(arr[0]);
//寻找第K个最大值
int k = 5,tmp;
int sortarr[k];
//对于sortarr初试化
for (int i = 0; i < k; i++)
{
sortarr[i] = arr[i];
}
//对于sotarr进行降序排序
for (int i = 0; i < k-1; i++)
{
for (int t = 0; t< k-i-1; t++)
{
if (sortarr[t] < sortarr[t+1])
{
tmp = sortarr[t];
sortarr[t] = sortarr[t+1];
sortarr[t+1]=tmp;
}
}
}
//将arr中元素于sortarr中的比较
for (int i = k; i < arrsize; i++)
{
//比较t
for (int j = 0; j < k ; j++)
{
if (arr[i]>sortarr[j])
{
if (i-k<k-1)
{
//后面移动
for (int cout = k-1; cout>j; cout--)
{
sortarr[cout]=sortarr[cout-1];
}
sortarr[j]=arr[i];
}else
{
sortarr[k-1]=arr[i];
}
break;//只让其比较一次
}
}
}
//输出调试
for (int i = 0; i < k; i++)
{
printf("%d,",sortarr[i]);
}
return 0;
}