qsort

18

Click here to load reader

Upload: anonymous-3q6hik

Post on 12-May-2017

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: qsort

1

9/10/2003 CS2 - Quicksort 1

Partitioning

• Partitioning can be tricky, here is one method that works well:

1. Select a pivot, and exchange it with the last element2. Set i to the first element, and j to the next-to-last element3. While i < j

increment i until an element >= the pivot is founddecrement j until an element <= the pivot is foundif i < j, swap the elements

4. Exchange the pivot with the element at i

<p p ≥ p

9/10/2003 CS2 - Quicksort 2

Partitioning

2 97 17 37 12 46 10 55 80 42 39

Pick pivot == 37

Page 2: qsort

2

9/10/2003 CS2 - Quicksort 3

Partitioning

2 97 17 39 12 46 10 55 80 42 37

Step 1: Move pivot to end of array

9/10/2003 CS2 - Quicksort 4

Partitioning

2 97 17 39 12 46 10 55 80 42 37

Step 1: Move pivot to end of array

Page 3: qsort

3

9/10/2003 CS2 - Quicksort 5

Partitioning

2 97 17 39 12 46 10 55 80 42 37

Step 2: set i == 0 and j == array.length - 1

i j

9/10/2003 CS2 - Quicksort 6

Partitioning

2 97 17 39 12 46 10 55 80 42 37

Step 3: move i left until value larger than the pivot is found

i j

Page 4: qsort

4

9/10/2003 CS2 - Quicksort 7

Partitioning

2 97 17 39 12 46 10 55 80 42 37

Step 4: move j right until value less than the pivot is found

i j

9/10/2003 CS2 - Quicksort 8

Partitioning

2 10 17 39 12 46 97 55 80 42 37

Step 5: swap elements at positions i and j

i j

Page 5: qsort

5

9/10/2003 CS2 - Quicksort 9

Partitioning

2 10 17 39 12 46 97 55 80 42 37

i j

Step 6: move i left until value larger than the pivot is found

9/10/2003 CS2 - Quicksort 10

Partitioning

2 10 17 39 12 46 97 55 80 42 37

i j

Step 7: move j right until value less than the pivot is found

Page 6: qsort

6

9/10/2003 CS2 - Quicksort 11

Partitioning

2 10 17 12 39 46 97 55 80 42 37

i j

Step 8: swap elements at positions i and j

9/10/2003 CS2 - Quicksort 12

Partitioning

2 10 17 12 39 46 97 55 80 42 37

i

j

Step 9: move i left until it hits j

Page 7: qsort

7

9/10/2003 CS2 - Quicksort 13

Partitioning

2 10 17 12 37 46 97 55 80 42 39

i

j

Step 10: put pivot in correct spot

9/10/2003 CS2 - Quicksort 14

Partitioning

2 10 17 12 37 46 97 55 80 42 39

pivot

< pivot ≥ pivot

Page 8: qsort

8

9/10/2003 CS2 - Quicksort 15

Partitioningpublic static void partition( int numbers[], int lo, int hi ) {

int i = lo + 1, j = hi, pivot = numbers[lo];

while ( i < j ) {while ( numbers[i] < pivot ) i++;while ( numbers[j] > pivot ) j++;

if ( i <= j ) {int tmp = numbers[i];numbers[i] = numbers[j];numbers[j] = tmp;

}}

numbers[0] = numbers[i]; numbers[i] = pivot;

return i;}

9/10/2003 CS2 - Quicksort 16

Quicksort

• The quicksort algorithm (S is the array of elements to be sorted):

• Selecting the pivot wisely can significantly improve the performance of the algorithm

1. If the length of S is 0 or 1, return2. Pick any element p in S; this is the pivot3. Partition S (by rearranging its elements) into two subsets:

S1, containing all elements of S-p which are < pS2, containing all elements of S-p which are >= p

4. Return quicksort(S1) followed by p, followed by quicksort(S2)

Page 9: qsort

9

9/10/2003 CS2 - Quicksort 17

Selecting the Pivot

• Pivot = First Element– simple, but often the worst possible choice. Consider

what happens if the array is already sorted

• Pivot = Random Element– safe is almost all situations, however, calculating a

random number can be costly

• Pivot = Median Value– optimal, but impractical to implement

• Pivot = Median of three– a compromise, gives reasonably good performance

9/10/2003 CS2 - Quicksort 18

Analysis

nn/2 n/2

n/4 n/4 n/4 n/4n/8n/8n/8n/8n/8n/8n/8n/8

log2n

n

Best Case Complexity nlog2n

Page 10: qsort

10

9/10/2003 CS2 - Quicksort 19

Analysis

nn-1

n-2n-3

1

32

…n

n

Worst Case Complexity n2

9/10/2003 CS2 - Quicksort 20

Merging

• Merging two sorted arrays into a single sorted array is straight forward

1. Set i and j to 02. While i < array1.length and j < array2.length3. If array1[i]<array2[j] then

copy array1[I] to the new array and increment iotherwise, copy array2[j] to the new array and increment j

4. Copy the rest of the “non-empty” array to the new array

Page 11: qsort

11

9/10/2003 CS2 - Quicksort 21

Merging

2 3 8 3 4 6 7

i j

k

9/10/2003 CS2 - Quicksort 22

Merging

2 3 8 3 4 6 7

2

i j

k

Page 12: qsort

12

9/10/2003 CS2 - Quicksort 23

Merging

2 3 8 3 4 6 7

2

i j

k

9/10/2003 CS2 - Quicksort 24

Merging

2 3 8 3 4 6 7

2 3

i j

k

Page 13: qsort

13

9/10/2003 CS2 - Quicksort 25

Merging

2 3 8 3 4 6 7

2 3 3

i j

k

9/10/2003 CS2 - Quicksort 26

Merging

2 3 8 3 4 6 7

2 3 3 4

i j

k

Page 14: qsort

14

9/10/2003 CS2 - Quicksort 27

Merging

2 3 8 3 4 6 7

2 3 3 4 6

i j

k

9/10/2003 CS2 - Quicksort 28

Merging

2 3 8 3 4 6 7

2 3 3 4 6 7

i j

k

Page 15: qsort

15

9/10/2003 CS2 - Quicksort 29

Merging

2 3 8 3 4 6 7

2 3 3 4 6 7 8

i j

k

9/10/2003 CS2 - Quicksort 30

Merge Sort2 97 17 39 12 46 10 55 80 42 37

2 97 17 39 12 46 10 55 80 42 37

39 12 10 55 42 37

2 97 17 39 12 80 42 3746 10 55

2 97 39 12 10 55 42 3717 46 80

Page 16: qsort

16

9/10/2003 CS2 - Quicksort 31

Merge Sort2 97 17 39 12 46 10 55 80 42 37

2 97 17 39 12 46 10 55 80 42 37

39 12 10 55 42 37

2 97 17 39 12 80 42 3746 10 55

2 97 12 39 10 55 37 4217 46 80

9/10/2003 CS2 - Quicksort 32

Merge Sort2 97 17 39 12 46 10 55 80 42 37

2 97 17 39 12 46 10 55 80 42 37

39 12 10 55 42 37

2 97 12 17 39 37 42 8010 46 55

2 97 12 39 10 55 37 4217 46 80

Page 17: qsort

17

9/10/2003 CS2 - Quicksort 33

Merge Sort2 97 17 39 12 46 10 55 80 42 37

2 12 17 39 97 10 37 42 46 55 80

39 12 10 55 42 37

2 97 12 17 39 37 42 8010 46 55

2 97 12 39 10 55 37 4217 46 80

9/10/2003 CS2 - Quicksort 34

Merge Sort2 10 12 17 37 39 42 46 55 80 97

2 12 17 39 97 10 37 42 46 55 80

39 12 10 55 42 37

2 97 12 17 39 37 42 8010 46 55

2 97 12 39 10 55 37 4217 46 80

Page 18: qsort

18

9/10/2003 CS2 - Quicksort 35

Analysis

nn/2 n/2

n/4 n/4 n/4 n/4n/8n/8n/8n/8n/8n/8n/8n/8

log2n

n

Complexity nlog2n