
Sorting Algorithm

This is a sorting algorithm.   It may be applied to a set of data in order to sort it.    
For comparing various sorts, see compare sorts.  
For other sorting algorithms,   see sorting algorithms,   or:

O(n logn) sorts
Heap sort |
Merge sort |
Patience sort |
Quick sort
O(n log2n) sorts
Shell Sort
O(n2) sorts
Bubble sort |
Cocktail sort |
Cocktail sort with shifting bounds |
Comb sort |
Cycle sort |
Gnome sort |
Insertion sort |
Selection sort |
Strand sort
other sorts
Bead sort |
Bogo sort |
Common sorted list |
Composite structures sort |
Custom comparator sort |
Counting sort |
Disjoint sublist sort |
External sort |
Jort sort |
Lexicographical sort |
Natural sorting |
Order by pair comparisons |
Order disjoint list items |
Order two numerical lists |
Object identifier (OID) sort |
Pancake sort |
Quickselect |
Permutation sort |
Radix sort |
Ranking methods |
Remove duplicate elements |
Sleep sort |
Stooge sort |
[Sort letters of a string] |
Three variable sort |
Topological sort |
Tree sort


Task

Sort an array (or list) of strings in order of descending length, and in ascending lexicographic order for strings of equal length.

Use a sorting facility provided by the language/library, combined with your own callback comparison function.


Note:   Lexicographic order is case-insensitive.




use Collection;
 
class Test {
  function : Main(args : String[]) ~ Nil {
    v := CreateHolders(["Here", "are", "some", "sample", "strings", "to", "be", "sorted"]);
    "unsorted: "->Print(); Show(v);
    v->Sort();
    "sorted: "->Print(); Show(v);
  }
 
  function : CreateHolders(strings : String[]) ~ CompareVector {
    vector := CompareVector->New();
    each(i : strings) {
      vector->AddBack(StringHolder->New(strings[i]));
    };
 
    return vector;
  }
 
  function : Show(v : CompareVector) ~ Nil {
    each(i : v) {
      s := v->Get(i)->As(StringHolder);
      s->ToString()->Print();
      if(i + 1 < v->Size()) {
        ','->Print();
      };
    };
    '\n'->Print();
  }
}
 
class StringHolder implements Compare {
  @s : String;
 
  New(s : String) {
    @s := s;
  }
 
  method : public : Compare(c : Compare) ~ Int {
    h := c->As(StringHolder);
    r := h->ToString();
    size := r->Size() - @s->Size();
    if(size = 0) {
      size := @s->ToUpper()->Compare(r->ToUpper());
    };
 
    return size;
  }
 
  method : public : HashID() ~ Int {
    return @s->HashID();
  }
 
  method : public : ToString() ~ String {
    return @s;
  }
}