Download - 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.

Transcript
Page 1: 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.

Faster Sorting Methods

Chapter 9

Page 2: 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.

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

Page 3: 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.

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

Page 4: 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.

4

Merge Sort

Merging two sorted arrays

into one sorted array.

Page 5: 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.

5

Merge Sort

The major steps in a merge sort.

Page 6: 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.

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]

}

Page 7: 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.

7

Merge Sort

The effect of the recursive calls and the merges during a merge sort.

Page 8: 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.

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

Page 9: 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.

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)

Page 10: 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.

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);

Page 11: 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.

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

Page 12: 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.

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

}

Page 13: 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.

13

Quick Sort

A partition of an array during a quick sort.

Page 14: 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.

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

Page 15: 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.

15

Quick Sort

A partition strategy for quick sort … continued→

Page 16: 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.

16

Quick Sort

A partition strategy for quick sort.

Page 17: 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.

17

Quick Sort

Median-of-three pivot selection: (a) the original array; (b) the array with its

first, middle, and last elements sorted

Page 18: 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.

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.

Page 19: 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.

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

Page 20: 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.

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

Page 21: 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.

21

Radix Sort

(a) Original array and buckets after first distribution; (b) reordered array and buckets after second distribution …

continued →

Page 22: 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.

22

Radix Sort

(c) reordered array and buckets after third distribution; (d) sorted array

Page 23: 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.

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

Page 24: 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.

24

Comparing the Algorithms

The time efficiency of various algorithms in Big Oh notation

Page 25: 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.

25

Comparing the Algorithms

A comparison of growth-rate functions as n increases.