0% found this document useful (0 votes)
13 views21 pages

06 Linear Sort

The document discusses three non-comparison based sorting algorithms: counting sort, radix sort, and bucket sort. Counting sort runs in O(n+k) time where k is the range of input values. Radix sort treats numbers as d-digit numbers in a given base and runs in O(d(n+k')) time where d is the number of digits and k' is the range per digit. Bucket sort requires uniformly distributed input and runs in expected O(n) time by distributing elements into buckets.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views21 pages

06 Linear Sort

The document discusses three non-comparison based sorting algorithms: counting sort, radix sort, and bucket sort. Counting sort runs in O(n+k) time where k is the range of input values. Radix sort treats numbers as d-digit numbers in a given base and runs in O(d(n+k')) time where d is the number of digits and k' is the range per digit. Bucket sort requires uniformly distributed input and runs in expected O(n) time by distributing elements into buckets.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 21

Algorithms

Sorting in Linear Time


Dr. Ashish Sharma

David Luebke 1 06/06/24


Non-Comparison Based Sorting
● Many times we have restrictions on our keys
■ Deck of cards: Ace->King and four suites
■ Social Security Numbers
■ Employee ID’s
● We will examine three algorithms which under
certain conditions can run in O(n) time.
■ Counting sort
■ Radix sort
■ Bucket sort
Counting Sort
● Depends on assumption about the numbers
being sorted
■ Assume numbers are in the range 1.. k
● The algorithm:
■ Input: A[1..n], where A[j]  {1, 2, 3, …, k}
■ Output: B[1..n], sorted (not sorted in place)
■ Also: Array C[1..k] for auxiliary storage
Counting Sort
1 CountingSort(A, B, k)
2 for i=1 to k
3 C[i]= 0;
4 for j=1 to n
5 C[A[j]] = C[A[j]] + 1;
6 for i=2 to k
7 C[i] = C[i] + C[i-1];
8 for j=n downto 1
9 B[C[A[j]]] = A[j];
10 C[A[j]] = C[A[j]] - 1;
Counting Sort Example
Counting Sort
1 CountingSort(A, B, k)
2 for i=1 to k
Takes time O(k)
3 C[i]= 0;
4 for j=1 to n
5 C[A[j]] = C[A[j]] - 1;
6 for i=2 to k
Takes time O(n)
7 C[i] = C[i] + C[i-1];
8 for j=n downto 1
9 B[C[A[j]]] = A[j];
10 C[A[j]] = C[A[j]] - 1;

What is the running time?


Counting Sort
● Total time: O(n + k)
■ Works well if k = O(n) or k = O(1)
● This algorithm / implementation is stable.
■ A sorting algorithm is stable when numbers with
the same values appear in the output array in the
same order as they do in the input array.
Counting Sort
● Why don’t we always use counting sort?
■ Depends on range k of elements.

● Could we use counting sort to sort 32 bit


integers? Why or why not?
Counting Sort Review
● Assumption: input taken from small set of numbers of size k
● Basic idea:
■ Count number of elements less than you for each element.
■ This gives the position of that number – similar to selection sort.
● Pro’s:
■ Fast
■ Asymptotically fast - O(n+k)
■ Simple to code
● Con’s:
■ Doesn’t sort in place.
■ Elements must be integers.
■ Requires O(n+k) extra storage.
countable
Radix Sort
● How did IBM get rich originally?
● Answer: punched card readers for census
tabulation in early 1900’s.
■ In particular, a card sorter that could sort cards
into different bins
○ Each column can be punched in 12 places
○ Decimal digits use 10 places
■ Problem: only one column can be sorted on at a
time
Radix Sort
● Intuitively, you might sort on the most
significant digit, then the second msd, etc.
● Problem: lots of intermediate piles of cards
(read: scratch arrays) to keep track of
● Key idea: sort the least significant digit first
RadixSort(A, d)
for i=1 to d
StableSort(A) on digit i
Radix Sort Example
Radix Sort Correctness
● Sketch of an inductive proof of correctness
(induction on the number of passes):
■ Assume lower-order digits {j: j<i }are sorted
■ Show that sorting next digit i leaves array correctly
sorted
○ If two digits at position i are different, ordering
numbers by that digit is correct (lower-order digits
irrelevant)
○ If they are the same, numbers are already sorted on the
lower-order digits. Since we use a stable sort, the
numbers stay in the right order
Radix Sort
● What sort is used to sort on digits?
● Counting sort is obvious choice:
■ Sort n numbers on digits that range from 1..k
■ Time: O(n + k)
● Each pass over n numbers with d digits takes
time O(n+k), so total time O(dn+dk)
■ When d is constant and k=O(n), takes O(n) time
Radix Sort
● Problem: sort 1 million 64-bit numbers
■ Treat as four-digit radix 216 numbers
■ Can sort in just four passes with radix sort!
● Performs well compared to typical
O(n lg n) comparison sort
■ Approx lg(1,000,000)  20 comparisons per
number being sorted
Radix Sort Review
● Assumption: input has d digits ranging from 0 to k
● Basic idea:
■ Sort elements by digit starting with least significant
■ Use a stable sort (like counting sort) for each stage
● Pro’s:
■ Fast
■ Asymptotically fast (i.e., O(n) when d is constant and k=O(n))
■ Simple to code
■ A good choice
● Con’s:
■ Doesn’t sort in place
■ Not a good choice for floating point numbers or arbitrary strings.
Bucket Sort
Assumption: input elements distributed uniformly over some
known range, e.g., [0,1), so all elements in A are greater than or
equal to 0 but less than 1 . (Appendix C.2 has definition of uniform
distribution)
Bucket-Sort(A)
1. n = length[A]
2. for i = 1 to n
3. do insert A[i] into list B[floor of nA[i]]
4. for i = 0 to n-1
5. do sort list i with Insertion-Sort
6. Concatenate lists B[0], B[1],…,B[n-1]
Bucket Sort
Bucket-Sort(A, x, y)
1. divide interval [x, y) into n equal-sized subintervals (buckets)
2. distribute the n input keys into the buckets
3. sort the numbers in each bucket (e.g., with insertion sort)
4. scan the (sorted) buckets in order and produce output array

Running time of bucket sort: O(n) expected time


Step 1: O(1) for each interval = O(n) time total.
Step 2: O(n) time.
Step 3: The expected number of elements in each bucket is O(1)
(see book for formal argument, section 8.4), so total is O(n)
Step 4: O(n) time to scan the n buckets containing a total of n input
elements
Bucket Sort Example
Bucket Sort Review
● Assumption: input is uniformly distributed across a range
● Basic idea:
■ Partition the range into a fixed number of buckets.
■ Toss each element into its appropriate bucket.
■ Sort each bucket.
● Pro’s:
■ Fast
■ Asymptotically fast (i.e., O(n) when distribution is uniform)
■ Simple to code
■ Good for a rough sort.
● Con’s:
■ Doesn’t sort in place
Summary of Linear Sorting
Non-Comparison Based Sorts
Running Time
worst-case average-case best-case in place
Counting Sort O(n + k) O(n + k) O(n + k) no
Radix Sort O(d(n + k')) O(d(n + k')) O(d(n + k')) no
Bucket Sort O(n) no
Counting sort assumes input elements are in range [0,1,2,..,k] and
uses array indexing to count the number of occurrences of each
value.
Radix sort assumes each integer consists of d digits, and each digit is
in range [1,2,..,k'].
Bucket sort requires advance knowledge of input distribution (sorts n
numbers uniformly distributed in range in O(n) time).

You might also like