37
Sorting Chapter 10

Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

  • View
    217

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Sorting

Chapter 10

Page 2: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 2

Chapter Objectives

• To learn how to use the standard sorting methods in the Java API

• To learn how to implement the following sorting algorithms: selection sort, bubble sort, insertion sort, Shell sort, merge sort, heapsort, and quicksort

• To understand the difference in performance of these algorithms, and which to use for small arrays, which to use for medium arrays, and which to use for large arrays

Page 3: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 3

Using Java Sorting Methods

• Java API provides a class Arrays with several overloaded sort methods for different array types

• The Collections class provides similar sorting methods• Sorting methods for arrays of primitive types are based

on quicksort algorithm• Method of sorting for arrays of objects and Lists based

on mergesort

Page 4: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 4

Using Java Sorting Methods

Page 5: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 5

Declaring a Generic Method

Page 6: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 6

What is Sorting?

• Suppose we have an array of integers• We want to put these into ascending order

• Smallest (element 0) to biggest (element n -1)• For example, suppose we have the array of 5 integers:

27

10

15

31

11

11

15

27

31

10

sort

Page 7: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 7

Performance of Sorting Algorithms

• We usually want to know…• How many comparisons are required• How many exchanges are required

• We are also interested in…• Work required in best-case • Work required in worst-case • Work required in average-case

• Worst-case easiest to analyze, average-case is hardest• Also want to know when best-case and worst-case occur

• Often, something like “array already sorted” or “array is in descending order”, etc.

Page 8: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 8

Selection Sort

• Make several passes thru array• Each time thru, select next smallest item

• And place item where it belongs in array

27

10

15

31

11

27

11

15

31

10

11

27

15

31

10

11

15

27

31

10

11

15

27

31

10

Page 9: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 9

Selection Sort Algorithm

Page 10: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 10

Selection Sort Algorithm

• How many comparisons?• (n-1) + (n-2) + … + 1 • Which is O(n2)

• How many exchanges?• Worst case: n• Best case: 0• So, we’ll say it’s O(n)

• Selection sort is said to be quadratic• Because O(n2) comparisons

Page 11: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 11

Bubble Sort

• Compares adjacent array elements and exchanges their values if they are out of order

• Small values “bubble up” to the top of the array• Repeat enough times, and entire array is sorted

• How much is enough?

Page 12: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 12

Bubble Sort

• Small guys “bubble up” to the top

27

10

15

31

11

27

10

15

31

11

10

27

15

31

11

10

27

15

31

11

10

15

27

31

11

compare compare compare

swap swap

10

15

27

31

11

compare

• And repeat from top again (and again…)

Page 13: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 13

Bubble Sort

Page 14: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 14

Bubble Sort Algorithm

do

for each pair of adjacent array elementsIf out of order, exchange the values

while array not sorted

• Question: How do you know when array is sorted?• Answer: One pass thru array with no exchanges

Page 15: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 15

Analysis of Bubble Sort

• Excellent performance in some cases and very poor performances in other cases

• What is the best case?• Array already sorted• Best case analysis

• O(n) comparisons and O(1) exchanges• What is the worst case?• Array is in descending order• Worst case analysis

• (n-1) + (n-2) + … + 2 + 1 comparisons and exchanges• O(n2) comparisons and O(n2) exchanges

Page 16: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 16

Insertion Sort

• Based on the technique used by card players to arrange a hand of cards• Player picks up cards one at a time• When player picks up a card, inserts it in proper place

Page 17: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 17

Insertion Sort

• Note that we only need to use one array

27

10

15

31

11

27

10

15

31

11

11

27

15

31

10

11

15

27

31

10

11

15

27

31

10

Page 18: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 18

Analysis of Insertion Sort

• What is the worst case?• Number of comparisons: (n-1) + (n-2) + … + 2 + 1• This is (also) O(n2)

• What is the best case?• Number of comparisons: O(n)

• How many shifts when inserting elements?• Same as the number of comparisons (or one less) • Note that a shift in an insertion sort moves only one

item• An exchange in a bubble or selection sort requires

swap (temp storage, three items)

Page 19: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 19

Comparison of Quadratic Sorts

• None of these are good for large arrays• Faster sorting methods exist, but more complex

Page 20: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 20

Shell Sort: A Better Insertion Sort

• Shell sort is a type of insertion sort but with O(n^(3/2)) or better performance

• Named after its discoverer, Donald Shell• Divide and conquer approach to insertion sort• Instead of sorting the entire array, sort many smaller

subarrays using insertion sort before sorting the entire array

Page 21: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 21

Analysis of Shell Sort

• A general analysis of Shell sort is an open research problem in computer science

• Performance depends on how the decreasing sequence of values for gap is chosen

• If successive powers of two are used for gap, performance is O(n*n)

• If Hibbard’s sequence is used, performance is O(n^(3/2))

Page 22: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 22

Merge Sort

• A merge is a common data processing operation that is performed on two sequences of data with the following characteristics• Both sequences contain items with a common

compareTo method• The objects in both sequences are ordered in

accordance with this compareTo method

Page 23: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 23

Merge Algorithm

• Merge Algorithm• Access the first item from both sequences• While not finished with either sequence

• Compare the current items from the two sequences, copy the smaller current item to the output sequence, and access the next item from the input sequence whose item was copied

• Copy any remaining items from the first sequence to the output sequence

• Copy any remaining items from the second sequence to the output sequence

Page 24: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 24

Analysis of Merge

• For two input sequences that contain a total of n elements, we need to move each element’s input sequence to its output sequence• Merge time is O(n)

• We need to be able to store both initial sequences and the output sequence• The array cannot be merged in place• Additional space usage is O(n)

Page 25: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 25

Algorithm and Trace of Merge Sort

Page 26: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 26

Algorithm and Trace of Merge Sort (continued)

Page 27: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 27

Heapsort

• Merge sort time is O(n log n) but still requires, temporarily, n extra storage items

• Heapsort does not require any additional storage

Page 28: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 28

Algorithm for In-Place Heapsort

• Build a heap by arranging the elements in an unsorted array

• While the heap is not empty• Remove the first item from the heap by swapping it

with the last item and restoring the heap property

Page 29: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 29

Quicksort

• Developed in 1962• Quicksort rearranges an array into two parts so that all

the elements in the left subarray are less than or equal to a specified value, called the pivot

• Quicksort ensures that the elements in the right subarray are larger than the pivot

• Average case for Quicksort is O(n log n)

Page 30: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 30

Quicksort (continued)

Page 31: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 31

Algorithm for Partitioning

Page 32: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 32

Revised Partition Algorithm

• Quicksort is O(n*n) when each split yields one empty subarray, which is the case when the array is presorted

• Best solution is to pick the pivot value in a way that is less likely to lead to a bad split• Requires three markers

• First, middle, last

• Select the median of the these items as the pivot

Page 33: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 33

Testing the Sort Algorithms

• Need to use a variety of test cases• Small and large arrays• Arrays in random order• Arrays that are already sorted• Arrays with duplicate values

• Compare performance on each type of array

Page 34: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 34

The Dutch National Flag Problem

• A variety of partitioning algorithms for quicksort have been published

• A partitioning algorithm for partitioning an array into three segments was introduced by Edsger W. Dijkstra

• Problem is to partition a disordered three-color flag into the appropriate three segments

Page 35: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 35

The Dutch National Flag Problem

Page 36: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 36

Chapter Review

• Comparison of several sorting algorithms were made• Three quadratic sorting algorithms are selection sort,

bubble sort, and insertion sort• Shell sort gives satisfactory performance for arrays up to

5000 elements• Quicksort has an average-case performance of O(n log

n), but if the pivot is picked poorly, the worst case performance is O(n*n)

• Merge sort and heapsort have O(n log n) performance

Page 37: Sorting Chapter 10. Chapter 10: Sorting2 Chapter Objectives To learn how to use the standard sorting methods in the Java API To learn how to implement

Chapter 10: Sorting 37

Chapter Review (continued)

• The Java API contains “industrial strength” sort algorithms in the classes java.util.Arrays and java.util.Collections