C 数组中的最小n个数
如何在一个数组中组合一组最小数或最大数?例如,如果我想在1000大小的数组中找到最低的10个数字 我用C语言工作,但我不需要特定语言的答案。我只是想找出一种处理这类任务的方法,因为最近经常出现这种情况。算法允许将预定义的最小数和最大数分开(无需完全排序)。它使用类似于快速排序算法的分区过程,但在pivot找到所需位置时停止。方法1:对数组排序 您可以对数组进行快速排序,获得前10个元素。但这是相当低效的,因为您只对前10个元素感兴趣,而对整个数组进行排序是一种过分的做法 方法2:进行线性遍历并跟踪10个元素。C 数组中的最小n个数,c,arrays,algorithm,C,Arrays,Algorithm,如何在一个数组中组合一组最小数或最大数?例如,如果我想在1000大小的数组中找到最低的10个数字 我用C语言工作,但我不需要特定语言的答案。我只是想找出一种处理这类任务的方法,因为最近经常出现这种情况。算法允许将预定义的最小数和最大数分开(无需完全排序)。它使用类似于快速排序算法的分区过程,但在pivot找到所需位置时停止。方法1:对数组排序 您可以对数组进行快速排序,获得前10个元素。但这是相当低效的,因为您只对前10个元素感兴趣,而对整个数组进行排序是一种过分的做法 方法2:进行线性遍历并跟
int-lowerTen=malloc(数组的大小);
//“数组”是包含1000个元素的数组
对于(inti=0;i实现优先级队列。
循环遍历所有数字并将它们添加到该队列中。
如果该队列的长度等于10,则开始检查当前数量是否低于该队列中的最高数量。
如果是,请删除该最高数字并添加当前数字
毕竟,您将拥有一个优先级队列,其中包含数组中最低的10个数字。
(所需时间应为O(n),其中n是数组的长度)
如果需要更多提示,请添加注释:)以下代码
干净地编译
执行所需的功能
可能不是最有效的
处理重复项
需要修改以处理小于0的数字
现在是代码
#include <stdlib.h> // size_t
void selectLowest( int *sourceArray, size_t numItemsInSource, int *lowestDest, size_t numItemsInDest )
{
size_t maxIndex = 0;
int maxValue = 0;
// initially populate lowestDest array
for( size_t i=0; i<numItemsInDest; i++ )
{
lowestDest[i] = sourceArray[i];
if( maxValue < sourceArray[i] )
{
maxValue = sourceArray[i];
maxIndex = i;
}
}
// search rest of sourceArray and
// if lower than max in lowestDest,
// then
// replace
// find new max value
for( size_t i=numItemsInDest; i<numItemsInSource; i++ )
{
if( maxValue > sourceArray[i] )
{
lowestDest[maxIndex] = sourceArray[i];
maxIndex = 0;
maxValue = 0;
for( size_t j=0; j<numItemsInDest; j++ )
{
if( maxValue < lowestDest[j] )
{
maxValue = lowestDest[j];
maxIndex = j;
}
}
}
}
} // end function: selectLowest
#包括//size\t
void selectlower(int*sourceArray,size\t numItemsInSource,int*lowerest,size\t numItemsInDest)
{
大小\u t最大索引=0;
int maxValue=0;
//最初填充最下面的数组
对于(size_t i=0;iSort数组。假设对int
数组进行排序是O(n)
(通过基数排序),而QuickSelect
是O(n^2)
最坏情况,我建议进行排序。@EOF方法可能取决于条件-如果我们不能允许出现最坏情况的概率很小,我们应该选择另一种方法(例如,具有O(nlogk)
复杂性的二进制堆)。请注意,在一般情况下,Q/S通常是首选排序。另一个选项是,它的设计明确避免了QuickSelect的最坏情况(但如果QuickSelect有能力,它将默认为QuickSelect)。方法2的一个变体是使用存储在数组中的二进制最大堆来保存最小值(或使用最小堆来存储最大值)。因为二进制最小堆上的操作是O(1)或O(log n),n是查找的值数(而n是数据集大小)这一行有两个问题:int lowerTen=(int*)malloc(数组的大小);
.1)在C中,强制转换返回值只是使代码混乱。返回的类型是void*
,可以分配给任何其他指针,2)malloc()
返回一个指针,但int lowerTen
是一个整数,而不是指针。关于这一行:for(int i=0;iThanks。我的c非常生疏。我应该提到这是伪代码。进行了更正
#include <stdlib.h> // size_t
void selectLowest( int *sourceArray, size_t numItemsInSource, int *lowestDest, size_t numItemsInDest )
{
size_t maxIndex = 0;
int maxValue = 0;
// initially populate lowestDest array
for( size_t i=0; i<numItemsInDest; i++ )
{
lowestDest[i] = sourceArray[i];
if( maxValue < sourceArray[i] )
{
maxValue = sourceArray[i];
maxIndex = i;
}
}
// search rest of sourceArray and
// if lower than max in lowestDest,
// then
// replace
// find new max value
for( size_t i=numItemsInDest; i<numItemsInSource; i++ )
{
if( maxValue > sourceArray[i] )
{
lowestDest[maxIndex] = sourceArray[i];
maxIndex = 0;
maxValue = 0;
for( size_t j=0; j<numItemsInDest; j++ )
{
if( maxValue < lowestDest[j] )
{
maxValue = lowestDest[j];
maxIndex = j;
}
}
}
}
} // end function: selectLowest