shegx01

shegx01

Just getting started with Elixir and trying to implement Quick-sort algorithm using recursion. It seems like everything works but keying in this [8,16,3,7,23,77,9,30] broke the flow.
I was expecting [3, 7, 8, 9, 16, 23, 77, 30] but I did get this
[3, 7, 8, 16, 23, 77, 9, 30].
Also did a google search and saw other solutions calling filter or partition fro Enum module, I’m keen on using list comprehension implementing it.
Here is the code.

defmodule Quick do
  def sort([]), do: []
  def sort([head|tail]) do
   less_than_head = for x <- tail, x <= head, do: x
   greater_than_head = for x <- tail, x > head, do: x
    sort(less_than_head) ++ [head] ++ (greater_than_head)
   end
end

please do advice and how I can improve it.

Showing Posts 1 to 6

hauleth

hauleth

You sort only less_than_head (BTW Your head is commonly called pivot) and greater_than_head is passed as is, so there is only partial sorting (only elements less than head are sorted).

EDIT: The big pro of using :lists.partition/2 is that it will split your list into two in one “walk” through the list instead of two, which can be improvement in case of long lists (but in such case the quick sort isn’t the best solution anyway, merge sort will work better).

So your 2 comprehensions can be easily replaced with:

{lesser, greater} = :lists.partition(& &1 <= head, tail)
shegx01

shegx01 OP

Got deprecated warning with Enum.partition/2,
Enum.split_with/2 instead.
Works great!
Thanks

My mistake :lists.partition/2 still works
updated to this

defmodule Quick do
  import Enum, only: [split_with: 2]
  def sort([]), do: []
  def sort([head|tail]) do
    {pivot, greater_than_head} = split_with(tail, &(&1 <= head))
    sort(pivot) ++ [head] ++ (greater_than_head)
   end

end

big thanks @hauleth

shegx01

shegx01 OP

Thanks to you,
Will replace the list comprehension with Enum.partition

NobbZ

NobbZ

Not the lesser_than_head is usually called pivot, but the head is. Its the pivot point you use to compare.

Also you are still not sorting the greater_than_head :wink:

hauleth

hauleth

This should be written as:

def sort([]), do: []
def sort([pivot | tail]) do
  {lesser, greater} = Enum.split_by(tail, & &1 <= pivot)

  sort(lesser) ++ [pivot] ++ sort(greater)
end

As you still do not sort greater part as @NobbZ said.

shegx01

shegx01 OP

Ohh,
It has been written well in the Idea, didn’t know I failed to include sort greater.
Thanks to you

— All posts loaded —

Where Next? Top

Trending in Questions Top

water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews