AA-Part09-Linear Time Sorting Algorithms
AA-Part09-Linear Time Sorting Algorithms
Algorithms Design
Outline
• More about sorting
– Theoretical lower-bound
– Linear-time sorting algorithms
– Stability of sorting
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Theoretical lower-bound
• Comparison sort: determines the relative
order of two elements only by comparison
– What else can you do …
• A = [9 6 5] 2 < 3? 1<3?
no no
• A = [5 6 9] yes yes
(1, 2, 3) 1 < 3? (2, 1, 3) 2 < 3?
• A=… yes yes no no
• n! possible permutations
• Therefore, at least log(n!) =
Θ(nlogn) comparisons in the worst
case
Θ(n!)
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Counting sort
• Knowledge: the numbers fall in a small range
• Example 1: sort the final exam score of a large
class
– 1000 students
– Maximum score: 100
– Minimum score: 0
– Scores are integers
• Example 2: sort students according to the first
letter of their last name
– Number of students: many
– Number of letters: 26
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Counting sort
Intuition
• S1: 100 0 85 90 100
• S2: 90
• S3: 85 S3 S2 S1
Intuition
75 85 90 100
1 1 2 2
Counting sort
1. for i 1 to k Initialize
do C[i] 0
2. for j 1 to n Count
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﺭﺱ :ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ ،ﺍﺳﺘﺎﺩ :ﺩﻭﻟﺘﺸﺎﻫﻰ
Counting-sort example
1 2 3 4 5 1 2 3 4
B:
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 1: initialization
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 0 0 0 0
B:
1. for i 1 to k
do C[i] 0
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 2: count
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 0 0 0 1
B:
2. for j 1 to n
do C[A[ j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 2: count
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 0 0 1
B:
2. for j 1 to n
do C[A[ j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 2: count
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 0 1 1
B:
2. for j 1 to n
do C[A[ j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 2: count
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 0 1 2
B:
2. for j 1 to n
do C[A[ j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 2: count
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 0 2 2
B:
2. for j 1 to n
do C[A[ j]] C[A[ j]] + 1 ⊳ C[i] = |{key = i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
A: 4 1 3 4 3 C: 1 0 2 2
B: C': 1 1 2 2
3. for i 2 to k
do C[i] C[i] + C[i–1] ⊳ C[i] = |{key i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
A: 4 1 3 4 3 C: 1 0 2 2
B: C': 1 1 3 2
3. for i 2 to k
do C[i] C[i] + C[i–1] ⊳ C[i] = |{key i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
A: 4 1 3 4 3 C: 1 0 2 2
B: C': 1 1 3 5
3. for i 2 to k
do C[i] C[i] + C[i–1] ⊳ C[i] = |{key i}|
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 3 5
B: 3 C': 1 1 3 5
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 3 5
B: 3 C': 1 1 2 5
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 2 5
B: 3 4 C': 1 1 2 5
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 2 5
B: 3 4 C': 1 1 2 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 2 4
B: 3 3 4 C': 1 1 2 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 2 4
B: 3 3 4 C': 1 1 1 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 1 4
B: 1 3 3 4 C': 1 1 1 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 1 1 1 4
B: 1 3 3 4 C': 0 1 1 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 0 1 1 4
B: 1 3 3 4 4 C': 0 1 1 4
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Loop 4: re-arrange
1 2 3 4 5 1 2 3 4
A: 4 1 3 4 3 C: 0 1 1 4
B: 1 3 3 4 4 C': 0 1 1 3
4. for j n downto 1
do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Analysis
1. for i 1 to k
(k) do C[i] 0
2.for j 1 to n
(n) do C[A[ j]] C[A[ j]] + 1
3.for i 2 to k
(k) do C[i] C[i] + C[i–1]
4.for j n downto 1
(n) do B[C[A[ j]]] A[ j]
C[A[ j]] C[A[ j]] – 1
(n + k)
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Running time
If k = O(n), then counting sort takes (n) time.
• But, theoretical lower-bound sorting takes
W(n log n) time!
• Problem with the theory?
Answer:
• Comparison sorting takes W(n log n) time.
• Counting sort is not a comparison sort.
• In fact, not a single comparison between
elements occurs!
ﺩﻭﻟﺘﺸﺎﻫﻰ: ﺍﺳﺘﺎﺩ، ﻃﺮﺍﺣﻰ ﺍﻟﮕﻮﺭﻳﺘﻢ:ﺩﺭﺱ
Stable sorting
Counting sort is a stable sort: it preserves
the input order among equal elements.
A: 4 1 3 4 3
B: 1 3 3 4 4