0% found this document useful (0 votes)
79 views2 pages

The Sound of Sorting Algorithm Cheat Sheet: A (J) A (Min)

This document provides pseudocode summaries for several sorting algorithms, including selection sort, insertion sort, merge sort, heap sort, quicksort, radix sort, cocktail shaker sort, and gnome sort. For each algorithm, it provides a high-level description and the key steps in 2-3 sentences.

Uploaded by

Suresh Sai
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
79 views2 pages

The Sound of Sorting Algorithm Cheat Sheet: A (J) A (Min)

This document provides pseudocode summaries for several sorting algorithms, including selection sort, insertion sort, merge sort, heap sort, quicksort, radix sort, cocktail shaker sort, and gnome sort. For each algorithm, it provides a high-level description and the key steps in 2-3 sentences.

Uploaded by

Suresh Sai
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 2

The Sound of Sorting Algorithm Cheat Sheet Procedure heapSort(A : Array [1 . . .

n] of Element)
buildHeap(A) // construct a max-heap in the array
Function selectionSort(A : Array of Element; n : N) while n > 1
for i := 1 to n do swap(A[1], A[n]) // take maximum
min := i n := n 1 // shrink heap area in array
for j := i + 1 to n do // find smallest element siftDown(A, 1) // correctly order A[1] in heap
if A[j] < A[min] then
min := j Procedure buildHeap(A : Array [1 . . . n] of Element)
endfor for i := bn/2c downto 1 do
swap(A[i], A[min]) // swap element to the beginning siftDown(i) // reestablish max-heap invariants
invariant A[1] A[i]
endfor Procedure siftDown(A : Array [1 . . . n] of Element; i : N)
if 2i > n then return
Function insertionSort(A : Array of Element; n : N) k := 2i // select right or left child
for i := 2 to n do // {A[1]} is sorted if (2i + 1 n) & (A[2i] A[2i + 1]) then // find smaller child
j := i k := k + 1
while (j > 0) & (A[j 1] > A[j]) // find right position j if A[i] < A[k] then // if child is larger than A[i],
swap(A[j 1], A[j]) // move larger elements to the back swap(A[i], A[k]) // switch with child
j := j 1 siftDown(A, k) // and move element further down
endwhile
invariant A[1] A[i] Procedure cocktailShakerSort(A : Array [1 . . . n] of Element)
endfor lo := 1, hi := n, mov := lo
while lo < hi do
Function mergeSort(A : Array of Element; lo, hi : N) for i := hi downto lo + 1 do
if hi lo 1 then return // base case if A[i 1] > A[i] then // move smallest element in
mid := (lo + hi)/2 // middle element swap(A[i 1], A[i]), mov := i // A[hi..lo] to A[lo]
mergeSort(lo, mid), mergeSort(mid, hi) // sort halves endfor
B := allocate (Array of Element size hi lo) lo := mov
i := lo, j := mid, k := 1 // running indexes for i := lo to hi 1 do
while (i < mid) & (j < hi) if A[i] > A[i + 1] then // move largest element in
if A[i] < A[j] B[k++] := A[i++] // merge! swap(A[i], A[i + 1]), mov := i // A[lo..hi] to A[hi]
else B[k++] := A[j++] endfor
endwhile hi := mov
while i < mid do B[k++] := A[i++] // copy remainder
while j < hi do B[k++] := A[j++] Procedure gnomeSort(A : Array [1 . . . n] of Element)
A[lo, . . . , hi 1] := B[1, . . . , (hi lo)] // copy back i := 2
dispose (B) while i n do
if A[i] A[i 1] then // move to right while
Procedure bubbleSort(A : Array [1 . . . n] of Element) i++ // elements grow larger
for i := 1 to n do else
for j := 1 to n i do swap(A[i], A[i 1]) // swap backwards while
if A[j] > A[j + 1] then // If right is smaller, if i > 2 then i // element grow smaller
swap(A[j], A[j + 1]) // move to the right endwhile
1 http://panthema.net/2013/sound-of-sorting
Procedure quickSort(A : Array of Element; `, r : N) Procedure LSDRadixSort(A : Array [1 . . . n] of Element)
if ` r then return K := 4 // number of buckets per round
q := pickPivotPos(A, `, r) D := dlogK (max{A[i] + 1 | i = 1, . . . , n})e // calculate number of rounds
m := partition(A, `, r, q) B := allocate (Array of Element size n) // temporary array B
quickSort(A, `, m 1), quickSort(A, m + 1, r) for d := 0 to D 1 do // sort by the d-th K-digit.
redefine key(x) := (x div K d ) mod K
KSortCopy(A, B, n), swap(A, B) // sort from A to B, and swap back
Function partition(A : Array of Element; `, r : N, q : N)
invariant A ist nach den K-Ziffern d..0 sortiert.
p := A[q] // pivot element
dispose (B)
swap(A[q], A[r]) // swap to the end
i := ` ` i j r Procedure KSortCopy(A, B : Array [1 . . . n] of Element; K : N)
invariant p >p ? p c = h0, . . . , 0i : Array [0 . . . K 1] of N
for j := ` to r 1 do for i := 1 to n do c[key(A[i])]++ // count occurrences
if A[j] p then sum := 1
swap(A[i], A[j]), i++ // move smaller to the front for k := 0 to K 1 do // exclusive prefix sum
` i r
p >p p next := sum + c[k], c[k] := sum, sum := next
assert
for i :=
 1 to n do
swap(A[i], A[r]) // move pivot into the middle 
` i r B c[key(A[i])]++ := A[i] // move element A[i] into bucket of B
assert p p >p
return i Procedure MSDRadixSort(A : Array [1 . . . n] of Element)
K := 4 // number of buckets per round
D := dlogK (max{A[i] + 1 | i = 1, . . . , n})e // count number of round
Procedure quickSortTernary(A : Array of Element; `, r : N) MSDRadixSortRec(A, D 1, K)
if ` r then return
q := pickPivotPos(A, `, r) Procedure MSDRadixSortRec(A : Array [1 . . . n] of Element; d, K : N)
(m, m0 ) := partitionTernary(A, `, r, q) c = h0, . . . , 0i : Array [0 . . . K 1] of N // KSort with in-place permuting
quickSortTernary(A, `, m 1), quickSortTernary(A, m0 + 1, r) redefine key(x) := (x div K d ) mod K
for i := 1 to n do c[key(A[i])]++ // count occurrences
b = h0, . . . , 0i : Array [0 . . . K] of N
Function partitionTernary(A : Array of Element; `, r : N; q : N)
sum := 1
p := A[q] // pivot element
for k := 0 to K do // inclusive prefix sum into b
i := `, j := `, k := r
` i j k r sum := sum + c[k], b[k] := sum
invariant <p >p ? =p assert b[K] = n
while (j k) // three-way comparison for i := 1 to n do 
if A[j] = p then swap(A[j], A[k]), k ; while j := b[key(A[i])] > i // walk on cycles until i
else if A[j] < p then swap(A[j], A[i]), i++ , j++ ; swap(A[i], A[j]) // move A[i] into right bucket
else j++ ; i := i + c[key(A[i])] // bucket of A[i] is finished
` i k r invariant A ist nach den K-Ziffern d..(D 1) sortiert
assert <p >p =p if d = 0 return // done?
i0 := i + r k + 1 for k := 0 to K 1 do // recursion into each of the K buckets if
swap(A[i . . . i0 ], A[k + 1 . . . r]) // move = p area to the middle if c[k] > 1 // it contains two or more elements
` i i0 r 
MSDRadixSortRec(A b[k] . . . b[k + 1] 1 , d 1, K)
assert <p =p >p
0
dispose (b), dispose (c)
return (i, i )
2 http://panthema.net/2013/sound-of-sorting

You might also like