
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


Use the quickselect algorithm on the vector

 [9, 8, 7, 6, 5, 0, 1, 2, 3, 4]
To show the first, second, third, ... up to the tenth largest member of the vector, in order, here on this page.

 Note: Quicksort has a separate task. 


 
program Quickselect_algorithm;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils;
 
function quickselect(list: TArray<Integer>; k: Integer): Integer;
 
  procedure Swap(i, j: Integer);
  var
    tmp: Integer;
  begin
    tmp := list[i];
    list[i] := list[j];
    list[j] := tmp;
  end;
 
begin
  repeat
    var px := length(list) div 2;
    var pv := list[px];
    var last := length(list) - 1;
 
    Swap(px, last);
    var i := 0;
    for var j := 0 to last - 1 do
      if list[j] < pv then
      begin
        swap(i, j);
        inc(i);
      end;
 
    if i = k then
      exit(pv);
 
    if k < i then
      delete(list, i, length(list))
    else
    begin
      Swap(i, last);
      delete(list, 0, i + 1);
      dec(k, i + 1);
    end;
  until false;
end;
 
begin
  var i := 0;
 
  while True do
  begin
    var v: TArray<Integer> := [9, 8, 7, 6, 5, 0, 1, 2, 3, 4];
    if i = length(v) then
      Break;
    Writeln(quickselect(v, i));
    inc(i);
  end;
  Readln;
end.