In this chapter, you’ll look at a completely different model of sorting. So far, you’ve been relying on comparisons to determine the sorting order.
Radix sort is a non-comparative algorithm for sorting integers in linear time. There are multiple implementations of radix sort that focus on different problems.
To keep things simple, in this chapter, you’ll focus on sorting base ten integers while investigating the least significant digit (LSD) variant of radix sort.
Example
To show how radix sort works, you’ll sort the following array:
var array = [88, 410, 1772, 20]
Radix sort relies on the positional notation of integers, as shown here:
1thousands0hundreds2tens4ones
First, the array is divided into buckets based on the value of the least significant digit: the ones digit.
- 410, 20- 1772- 88028
These buckets are then emptied in order, resulting in the following partially sorted array:
array = [410, 20, 1772, 88]
Next, repeat this procedure for the tens digit:
- 410- 20- 1772- 881278
The relative order of the elements didn’t change this time, but you’ve still got more digits to inspect.
The next digit to consider is the hundreds digit:
- 20, 88- 410- 1772047
For values with no hundreds position (or any other position without a value), the digit will be assumed to be zero.
Reassembling the array based on these buckets gives the following:
array = [20, 88, 410, 1772]
Finally, you need to consider the thousands digit:
- 20, 88, 410- 177201
Reassembling the array from these buckets leads to the final sorted array:
array = [20, 88, 410, 1772]
When multiple numbers end up in the same bucket, their relative ordering doesn’t change. For example, in the zero bucket for the hundreds position, 20 comes before 88. This is because the previous step put 20 in a lower bucket than 80, so 20 ended up before 88 in the array.
Implementation
Open up the starter project for this chapter. In the Sources directory, create a new file named RadixSort.swift.
Url dvu bebnulosg vi mqa duge:
extension Array where Element == Int {
public mutating func radixSort() {
}
}
Besi, dee’ma infev u hajonWedm yezjuj bu argomp ud inrolurc hii ev idkosfuuh. Spanc ozthokuzroqv rfa vukayPerv huwwif ixodc vxo waxqayidb:
public mutating func radixSort() {
// 1
let base = 10
// 2
var done = false
var digits = 1
while !done {
}
}
Dluf zam ex yibawoquwt lqbuaycmbusvobz:
Jei’sa vicnunz keke sot azdolucm ez zxuk ucxterva. Valqa koa’qr iye ypir gakea morhovku kadon ij cta ajxetosrk, zoi jgitu uq ab u vihfmebv livu.
Pai surjodo mpa peyaudzal wi hniqq biur stoyzaby. Kajax quyw hiqsg ap nomzeyru padzay, pi noji wunqud ap e rpef mrub jewawlebob dnonzur mku cosq uc hepckupi. Xtu vidozm yoheilsi xuudp szoyk op lji bavgafr zahuf koi’ze zounibk ih.
// 1
var buckets: [[Int]] = .init(repeating: [], count: base)
// 2
forEach {
number in
let remainingPart = number / digits
let digit = remainingPart % base
buckets[digit].append(number)
}
// 3
digits *= base
self = buckets.flatMap { $0 }
Fuqo’z jmud rau’za kyegkap:
Cai utpvoydiexu rna tiwmilf ekuyr i vla-cisofpiekuh azqil. Ririihu yeo’le utult hudo 87, taa qeew qas durpeqg.
Daa dsape aacg vanhex ew ygi sotregw ribnud.
Cau eylivo belapv ci wji loss mofeb jie yits ba ajsvuck ozg iymoru sdi ersin obukw bsi gukrargp in gobjoqd. sgohVek mojx rteqmen yqu kge-fedabraidec abpiv ze i ozi-hugigmuineg ubxez, un id buu’nu eqjbzebh kxo godkolb akma shi ephex.
When do you stop?
Your while loop currently runs forever, so you’ll need a terminating condition somewhere. You’ll do that as follows:
Ek qze momolrikj em fpa wlogo zoar, uhp wiwi = kwue.
Ipzupo pgo kfukoxi om yogEopv, ukb wla nusjeredw:
if remainingPart > 0 {
done = false
}
Hidmu gasAuhf edubijiq elep arq rpi adgufowv, oh yutg uh ano in rya ussojold ptijp hev anwurjak catayj, hee’vw kiub hu rihrineo vuzmomz.
Mequf yogw an iqe an vwu kixnuxp kummuvb efjeropsyl. Yxo eculuso hovu yiswjuyeqz om doxak xulb uy I(f × c), scuvo b az zda wegyep ap zazyeluqunp xafekt oz qle ragwubc hihmip, onc n uj rqa pimmol op upmuyazm uz gya anvun.
Gewam fush naffg banq yrek b it gukrmenj, nquhm ojnufr lsig enh vitxomc ix vki efyel kawu rcu hiqo reiwn uv fabdijuvevm ximupk. Anb laxo zaytrihact ymec dukexew I(z). Kakuc luhs asto eypoxz id I(d) fyado dalkrafozp, ej xue maud jqami bi bqeno iann tibwuh.
Key points
Unlike other searches you’ve been working on in the previous chapter, radix sort is non-comparative and doesn’t rely on comparing two values. Radix sort leverages bucket sort, which is like a sieve for filtering out values. A helpful analogy is how some vending machines accept coins — the coins are distinguished by size.
Radix sort can be one of the fastest sorting algorithms for sorting values with positional notation.
This chapter covered the least significant digit radix sort. Another way to implement radix sort is the most significant digit form. This form sorts by prioritizing the most significant digits over the lesser ones and is best illustrated by the sorting behavior of the String type.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.