Feature #36

File basis.anubis, new list sorter

Added by SpiceGuid - about 17 years ago. Updated about 17 years ago.

Status:NewStart date:
Priority:LowDue date:
Assignee:Alain Prouté% Done:

0%

Category:Libraries
Target version:1.x
Platform: Triage Stage:
Resolution:

Description

  • (4.5) Quick sorting of lists.*

The proposed sorter uses merge-sort for better space and time efficiency, it is also shorter than the quick-sort version.

define (List($T),List($T)) 
  split_even_odd
    (
      List($T) l,
      List($T) even,
      List($T) odd
    ) =
  if l is
    {
      [ ] then (even,odd),
      [h0 . t0] then 
         if t0 is
           {
             [ ] then ([h0.even],odd),
             [h1 . t1] then split_even_odd(t1,[h0.even],[h1.odd])
           }   
    }.

define List($T)
  merge_sorted
    (
      List($T) l1, 
      List($T) l2,
      ($T,$T) -> Bool less
    ) =
  if l1 is 
    {
      [ ] then l2,
      [h1 . t1] then
        if l2 is
          {
            [ ] then l1,
            [h2 . t2] then
               if less(h1,h2) then [h1.merge_sorted(t1,l2,less)]
               else [h2.merge_sorted(l1,t2,less)]
          }  
    }. 

public define List($T)
  qsort
    (
      List($T) l, 
      ($T,$T) -> Bool less
    ) =
  if l is
    {
      [ ] then [ ],
      [ha . ta] then
        if ta is
          {
            [ ] then [ha],
            [hb . tb] then
              if tb is [] then
                if less(ha,hb) then l else [hb,ha]
              else 
                with w = split_even_odd(l,[],[]),
                if w is (u,v) then
                merge_sorted(qsort(u,less),qsort(v,less),less)
          }
    }.

Also available in: Atom PDF

Redmine Appliance - Powered by TurnKey Linux