Faster Sorting Methods
Chapter 9
2
Chapter Contents Merge Sort
Merging Arrays Recursive Merge Sort The Efficiency of Merge Sort Merge Sort in the Java Class Library
Quick Sort The Efficiency of Quick Sort Creating the Partition Quick Sort in the Java Class Library
Radix Sort The Efficiency of Quick Sort
Comparing the Algorithms
3
Merge Sort
Divide an array into halves Sort the two halves Merge them into one sorted array
Referred to as a divide and conquer algorithm This is often part of a recursive algorithm However recursion is not a requirement
4
Merge Sort
Merging two sorted arrays
into one sorted array.
5
Merge Sort
The major steps in a merge sort.
6
Merge Sort
Algorithm mergeSort(a, first, last)
// Sorts the array elements a[first] through a[last] recursively.
if (first < last)
{
mid = (first + last)/2
mergeSort(a, first, mid)
mergeSort(a, mid+1, last)
Merge the sorted halves a[first..mid] and a[mid+1..last]
}
7
Merge Sort
The effect of the recursive calls and the merges during a merge sort.
8
Merge Sort Recursive Division step: Assume that n is a power of 2, so we can divide n by 2 evenly. Initial call divide into two subarrays of n/2 elements each. Second call divide into four subarrays of n/2^2 element each Third call divide array into eight subarrays of n/2^3 elements
each. If n= 8 = 2^3, it takes three level of recursive call to obtain
subarrays of one element each. So total k level of recursive calls result in k levels of merges. K =
log2n
9
Merge Sort Merge step: Need at most n-1 comparisons among the n elements in the two subarrays; n moves to
temporary array; n moves back to original array; In total, each merge requires at most 3n-1
2, 6 4,8 2,4,6,8
1)2<4, copy 2 to new array 2) 6>4, copy 4 to new array 3) 6<8, copy 6 to new array 4) copy 8 to new array
If 6 is replaced with 3? How many comparisons?
in last slide, when n=8, number of merges at each level: 3n -1 = 3n – 2^0: third merge level (3n/2 -1)*2 = 3n-2^1: second merge level (3n/2^2 -1 )*2^2 = 3n-4 = 3n – 2^2: first merge level Merge at each level is O(n), and total number of level k is log2n, the complexity of
mergeSort is O(n logn)
10
Merge Sort Efficiency of the merge sort
Merge sort is O(n log n) in all cases It's need for a temporary array is a disadvantage
Merge sort in the Java Class Library The class Arrays has sort routines that uses
the merge sort for arrays of objects
public static void sort(Object[] a);
public static void sort(Object[] a, int first, int last);
11
Quick Sort
Divides the array into two pieces Not necessarily halves of the array An element of the array is selected as the pivot
Elements are rearranged so that: The pivot is in its final position in sorted array Elements in positions before pivot are less than
the pivot Elements after the pivot are greater than the pivot
12
Quick Sort
Algorithm quickSort(a, first, last)
// Sorts the array elements a[first] through a[last] recursively.
if (first < last)
{ Choose a pivotPartition the array about the pivotpivotIndex = index of pivotquickSort(a, first, pivotIndex-1) // sort SmallerquickSort(a, pivotIndex+1, last) // sort Larger
}
13
Quick Sort
A partition of an array during a quick sort.
14
Quick Sort
Quick sort is O(n log n) in the average case
O(n2) in the worst case Worst case can be avoided by careful
choice of the pivot
15
Quick Sort
A partition strategy for quick sort … continued→
16
Quick Sort
A partition strategy for quick sort.
17
Quick Sort
Median-of-three pivot selection: (a) the original array; (b) the array with its
first, middle, and last elements sorted
18
Quick Sort
(a) The array with its first, middle, and last elements sorted; (b) the array after positioning the
pivot and just before partitioning.
19
Quick Sort Quick sort rearranges the elements in an
array during partitioning process After each step in the process
One element (the pivot) is placed in its correct sorted position
The elements in each of the two sub arrays Remain in their respective subarrays
The class Arrays in the Java Class Library uses quick sort for arrays of primitive types
20
Radix Sort
Does not compare objects Treats array elements as if they were strings
of the same length Groups elements by a specified digit or
character of the string Elements placed into "buckets" which match the
digit (character) Originated with card sorters when computers
used 80 column punched cards
21
Radix Sort
(a) Original array and buckets after first distribution; (b) reordered array and buckets after second distribution …
continued →
22
Radix Sort
(c) reordered array and buckets after third distribution; (d) sorted array
23
Radix Sort
Pseudo code
Algorithm radixSort(a, first, last, maxDigits)// Sorts the array of positive decimal integers a[first..last] into ascending order;// maxDigits is the number of digits in the longest integer.
for (i = 1 to maxDigits){ Clear bucket[0], bucket[1], . . . , bucket[9]
for (index = first to last){ digit = ith digit from the right of a[index]
Place a[index] at end of bucket[digit]}Place contents of bucket[0], bucket[1], . . . , bucket[9] into the array a
}
Radix sort is O(d*n) =O(n) but can only be used for certain kinds
of data
Radix sort is O(d*n) =O(n) but can only be used for certain kinds
of data
24
Comparing the Algorithms
The time efficiency of various algorithms in Big Oh notation
25
Comparing the Algorithms
A comparison of growth-rate functions as n increases.
Top Related