C 数组中的最小n个数

C 数组中的最小n个数,c,arrays,algorithm,C,Arrays,Algorithm,如何在一个数组中组合一组最小数或最大数?例如,如果我想在1000大小的数组中找到最低的10个数字 我用C语言工作,但我不需要特定语言的答案。我只是想找出一种处理这类任务的方法,因为最近经常出现这种情况。算法允许将预定义的最小数和最大数分开(无需完全排序)。它使用类似于快速排序算法的分区过程,但在pivot找到所需位置时停止。方法1:对数组排序 您可以对数组进行快速排序,获得前10个元素。但这是相当低效的,因为您只对前10个元素感兴趣,而对整个数组进行排序是一种过分的做法 方法2:进行线性遍历并跟

如何在一个数组中组合一组最小数或最大数?例如,如果我想在1000大小的数组中找到最低的10个数字

我用C语言工作,但我不需要特定语言的答案。我只是想找出一种处理这类任务的方法,因为最近经常出现这种情况。

算法允许将预定义的最小数和最大数分开(无需完全排序)。它使用类似于快速排序算法的分区过程,但在pivot找到所需位置时停止。

方法1:对数组排序 您可以对数组进行快速排序,获得前10个元素。但这是相当低效的,因为您只对前10个元素感兴趣,而对整个数组进行排序是一种过分的做法

方法2:进行线性遍历并跟踪10个元素。
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