
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


Sort an array of composite structures by a key.



For example, if you define a composite structure that presents a name-value pair (in pseudo-code):

Define structure pair such that: 
   name as a string
   value as a string

and an array of such pairs:

   x: array of pairs

then define a sort routine that sorts the array x by the key name.

This task can always be accomplished with Sorting Using a Custom Comparator.

If your language is not listed here, please see the other article.




 
use Collection;
 
class Entry implements Compare {
  @name : String;
  @value : Float;
 
  New(name : String, value : Float) {
    @name := name;
    @value := value;
  }
 
  method : public : Compare(rhs : Compare) ~ Int  {
    return @name->Compare(rhs->As(Entry)->GetName());
  }
 
  method : public : GetName() ~ String {
    return @name;
  }
 
  method : public : HashID() ~ Int {
    return @name->HashID();
  }
 
  method : public : ToString() ~ String {
    return "name={$@name}, value={$@value}";
  }
}
 
class Sorter {
  function : Main(args : String[]) ~ Nil {
    entries := CompareVector->New();
    entries->AddBack(Entry->New("Krypton", 83.798));
    entries->AddBack(Entry->New("Beryllium", 9.012182));
    entries->AddBack(Entry->New("Silicon", 28.0855));
    entries->AddBack(Entry->New("Cobalt", 58.933195)); 
    entries->AddBack(Entry->New("Selenium", 78.96));
    entries->AddBack(Entry->New("Germanium", 72.64));
 
    entries->Sort();
    each(i : entries) {
      entries->Get(i)->As(Entry)->ToString()->PrintLine();
    };
  }
}
 