Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8158411
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T17:35:25+00:00 2026-06-06T17:35:25+00:00

I need to find n lowest (which are not 0) from array of doubles

  • 0

I need to find n lowest (which are not 0) from array of doubles (let’s call the array samples). I need to do this many times in a loop, thus the speed of execution is crucial. I tried first sorting the array and then taking the first 10 values (which are not 0), however, although Array.Sort is said to be fast, it became the bottleneck:

const int numLowestSamples = 10;

double[] samples;

double[] lowestSamples = new double[numLowestSamples];

for (int count = 0; count < iterations; count++) // iterations typically around 2600000
{
    samples = whatever;
    Array.Sort(samples);
    lowestSamples = samples.SkipWhile(x => x == 0).Take(numLowestSamples).ToArray();
}

Thus I tried a different, but less clean solution, by first reading in the first n values, sorting them, then looping through all other values in samples checking if the value is smaller than the last value in the sorted lowestSamples array. If the value is lower then replace it with the one in the array and sort the array again. This turned out to be approximately 5 times faster:

const int numLowestSamples = 10;

double[] samples;

List<double> lowestSamples = new List<double>();

for (int count = 0; count < iterations; count++) // iterations typically around 2600000
{
    samples = whatever;

    lowestSamples.Clear();

    // Read first n values
    int i = 0;
    do
    {
        if (samples[i] > 0)
            lowestSamples.Add(samples[i]);

        i++;
    } while (lowestSamples.Count < numLowestSamples)

    // Sort the array
    lowestSamples.Sort();

    for (int j = numLowestSamples; j < samples.Count; j++) // samples.Count is typically 3600
    {
        // if value is larger than 0, but lower than last/highest value in lowestSamples
        // write value to array (replacing the last/highest value), then sort array so
        // last value in array still is the highest
        if (samples[j] > 0 && samples[j] < lowestSamples[numLowestSamples - 1])
        {
            lowestSamples[numLowestSamples - 1] = samples[j];
            lowestSamples.Sort();
        }
    }
}

Although this works relatively fast, I wanted to challenge anyone to come up with an even faster and better solution.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T17:35:28+00:00Added an answer on June 6, 2026 at 5:35 pm

    Instead of repeatedly sorting lowestSamples, just insert the sample where it would sit:

    int samplesCount = samples.Count;
    
    for (int j = numLowestSamples; j < samplesCount; j++)
    {
        double sample = samples[j];
    
        if (sample > 0 && sample < currentMax)
        {
            int k;
    
            for (k = 0; k < numLowestSamples; k++)
            {
               if (sample < lowestSamples[k])
               {
                  Array.Copy(lowestSamples, k, lowestSamples, k + 1, numLowestSamples - k - 1);
                  lowestSamples[k] = sample;
    
                  break;
               }
            }
    
            if (k == numLowestSamples)
            {
               lowestSamples[numLowestSamples - 1] = sample;
            }
    
            currentMax = lowestSamples[numLowestSamples - 1];
        }
    }
    

    Now, if numLowestSamples needs to be quite large (approaching the size of samples.count) then you may want to use a priority queue that may be faster (generally will be O(logn) for inserting the new sample rather than O(n/2) where n is numLowestSamples). The priority queue would be able to efficiently insert the new value and knock off the largest value on O(logn) time.

    With numLowestSamples at 10, there’s really no need for it — especially since you’re only dealing with doubles and not a complex data structure. With a heap and small numLowestSamples, the overhead of allocating memory for the heap nodes (most priority queues use heaps) would probably be greater than any searching/inserting efficiency gains (testing is important).

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I need to find out how many times the number greater than or less
I have to find the lowest possible sum from numbers' difference. Let's say I
I need to find a way to spin off a thread from a static
I need to find a way to call a vb.net function in my aspx
I need to find/create a library that can load hdr images in many formats
I need to find 2 elegant complete implementations of public static DateTime AddBusinessDays(this DateTime
I have an array with different IDs going from 1 to 4000. I need
I need a script to find out what is the lowest available domain name
Need to find records in subinv that do NOT have a listing in subinv
There are 100 numbers present in an array and I need to find out

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.