Given an array and an integer n, I would like to find n smallest elements of the array without sorting the whole array. Is there a pre-built function for this?
A possibility is using quantile from the standard module Stastitics:
julia> using Random
julia> x = randn(10)
10-element Array{Float64,1}:
 -0.6379363809698851 
 -0.0090041220949053 
  0.17604345125452092
  0.5721850349320371 
 -0.2539294101111369 
  1.9437627078528767 
 -1.8550277670889552 
 -0.6364790671658096 
 -0.33151525139752047
 -0.6843143431198958 
julia> using Statistics
julia> quantile(x, (0:2)./length(x))
3-element Array{Float64,1}:
 -1.8550277670889552
 -0.8013856855168016
 -0.6472119733998872
(EDIT: the first attempt was wrong: start with 0, not 1)
How about `PartialQuickSort’
using Base.Sort
function smallestn(a, n)
  sort(a; alg=Sort.PartialQuickSort(n))[1:n]
end
              
              
              2 Likes
            
            
          Yes, partial sort is what’s needed, and there are in fact partialsort! and partialsort functions.
Oh, right there and I missed it! Good eye.
You can use Heap structure from DataStructures.jl which can solve this sort of tasks very efficiently.
https://juliacollections.github.io/DataStructures.jl/latest/heaps/#Functions-using-heaps-1
              
              
              1 Like