qsort
TRANSCRIPT
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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