Quicksort http://math.hws.edu/TMCM/java/xSortLab/.

Slides:



Advertisements
Similar presentations
Introduction to Algorithms Quicksort
Advertisements

Algorithms Analysis Lecture 6 Quicksort. Quick Sort Divide and Conquer.
Quick Sort, Shell Sort, Counting Sort, Radix Sort AND Bucket Sort
QuickSort 4 February QuickSort(S) Fast divide and conquer algorithm first discovered by C. A. R. Hoare in If the number of elements in.
Efficient Sorts. Divide and Conquer Divide and Conquer : chop a problem into smaller problems, solve those – Ex: binary search.
Sorting. “Sorting” When we just say “sorting,” we mean in ascending order (smallest to largest) The algorithms are trivial to modify if we want to sort.
6-1 CM0551 Week 6 The Array Data Structure Properties of arrays and subarrays – recap. Sorting: insertion, quick-sort and their time and space complexity.
Quicksort CS 3358 Data Structures. Sorting II/ Slide 2 Introduction Fastest known sorting algorithm in practice * Average case: O(N log N) * Worst case:
The Substitution method T(n) = 2T(n/2) + cn Guess:T(n) = O(n log n) Proof by Mathematical Induction: Prove that T(n)  d n log n for d>0 T(n)  2(d  n/2.
25 May Quick Sort (11.2) CSE 2011 Winter 2011.
Quicksort COMP171 Fall Sorting II/ Slide 2 Introduction * Fastest known sorting algorithm in practice * Average case: O(N log N) * Worst case: O(N.
Data Structures Data Structures Topic #13. Today’s Agenda Sorting Algorithms: Recursive –mergesort –quicksort As we learn about each sorting algorithm,
Updated QuickSort Problem From a given set of n integers, find the missing integer from 0 to n using O(n) queries of type: “what is bit[j]
Quicksort Divide-and-Conquer. Quicksort Algorithm Given an array S of n elements (e.g., integers): If array only contains one element, return it. Else.
Fundamentals of Algorithms MCS - 2 Lecture # 16. Quick Sort.
Quicksort. Quicksort I To sort a[left...right] : 1. if left < right: 1.1. Partition a[left...right] such that: all a[left...p-1] are less than a[p], and.
Copyright © 2006 Pearson Addison-Wesley. All rights reserved. Sorting III 1 An Introduction to Sorting.
Quicksort. 2 Introduction * Fastest known sorting algorithm in practice * Average case: O(N log N) * Worst case: O(N 2 ) n But, the worst case seldom.
Quicksort.
Quicksort.
Unit 061 Quick Sort csc326 Information Structures Spring 2009.
Quicksort
Data Structures Review Session 1
Chapter 7 (Part 2) Sorting Algorithms Merge Sort.
Sorting II/ Slide 1 Lecture 24 May 15, 2011 l merge-sorting l quick-sorting.
Computer Algorithms Lecture 10 Quicksort Ch. 7 Some of these slides are courtesy of D. Plaisted et al, UNC and M. Nicolescu, UNR.
Sorting (Part II: Divide and Conquer) CSE 373 Data Structures Lecture 14.
1 Data Structures and Algorithms Sorting. 2  Sorting is the process of arranging a list of items into a particular order  There must be some value on.
Computer Science 101 Fast Searching and Sorting. Improving Efficiency We got a better best case by tweaking the selection sort and the bubble sort We.
Computer Science 101 Fast Algorithms. What Is Really Fast? n O(log 2 n) O(n) O(n 2 )O(2 n )
1 Sorting. 2 Chapter Outline How to use standard sorting methods in the Java API How to implement these sorting algorithms: Selection sort Bubble sort.
Chapter 9 Sorting. The efficiency of data handling can often be increased if the data are sorted according to some criteria of order. The first step is.
ICS201 Lecture 21 : Sorting King Fahd University of Petroleum & Minerals College of Computer Science & Engineering Information & Computer Science Department.
Nothing is particularly hard if you divide it into small jobs. Henry Ford Nothing is particularly hard if you divide it into small jobs. Henry Ford.
Quicksort Quicksort is a well-known sorting algorithm that, in the worst case, it makes Θ(n 2 ) comparisons. Typically, quicksort is significantly faster.
Quicksort This is probably the most popular sorting algorithm. It was invented by the English Scientist C.A.R. Hoare It is popular because it works well.
Algorithm Design Techniques, Greedy Method – Knapsack Problem, Job Sequencing, Divide and Conquer Method – Quick Sort, Finding Maximum and Minimum, Dynamic.
Advanced Sorting.
Simple Sorting Algorithms
Sorting.
Divide and Conquer divide and conquer algorithms typically recursively divide a problem into several smaller sub-problems until the sub-problems are.
Divide-And-Conquer-And-Combine
Chapter 7 Sorting Spring 14
Quicksort "There's nothing in your head the sorting hat can't see. So try me on and I will tell you where you ought to be." -The Sorting Hat, Harry Potter.
Data Structures and Algorithms
Quicksort 1.
Chapter 4: Divide and Conquer
Algorithm design and Analysis
Quick Sort (11.2) CSE 2011 Winter November 2018.
Unit-2 Divide and Conquer
Ch 7: Quicksort Ming-Te Chi
Data Structures Review Session
Divide-And-Conquer-And-Combine
Sub-Quadratic Sorting Algorithms
Sorting "There's nothing in your head the sorting hat can't see. So try me on and I will tell you where you ought to be." -The Sorting Hat, Harry Potter.
Chapter 4.
EE 312 Software Design and Implementation I
Quicksort.
CS 1114: Sorting and selection (part two)
Simple Sorting Algorithms
CSE 373 Data Structures and Algorithms
Data Structures & Algorithms
Quicksort.
CSE 326: Data Structures: Sorting
Simple Sorting Algorithms
Design and Analysis of Algorithms
CSE 332: Sorting II Spring 2016.
Searching and Sorting Hint at Asymptotic Complexity
Divide and Conquer Merge sort and quick sort Binary search
Quicksort.
Presentation transcript:

Quicksort http://math.hws.edu/TMCM/java/xSortLab/

Quicksort I To sort a[left...right]: 1. if left < right: 1.1. Partition a[left...right] such that: all a[left...p-1] are less than a[p], and all a[p+1...right] are >= a[p] 1.2. Quicksort a[left...p-1] 1.3. Quicksort a[p+1...right] 2. Terminate Source: David Matuszek

Partitioning (Quicksort II) A key step in the Quicksort algorithm is partitioning the array We choose some (any) number p in the array to use as a pivot We partition the array into three parts: p numbers less than p p numbers greater than or equal to p

Partitioning II Choose an array value (say, the first) to use as the pivot Starting from the left end, find the first element that is greater than or equal to the pivot Searching backward from the right end, find the first element that is less than the pivot Interchange (swap) these two elements Repeat, searching from where we left off, until done

Partitioning To partition a[left...right]: p = a[left]; l = left + 1; r = right; 2. while l < r, do 2.1. while l < right && a[l] < p { l = l + 1 } 2.2. while r > left && a[r] >= p { r = r – 1} 2.3. if l < r { swap a[l] and a[r] } 3. a[left] = a[r]; a[r] = p; 4. Terminate

Example of partitioning choose pivot: 4 3 6 9 2 4 3 1 2 1 8 9 3 5 6 search: 4 3 6 9 2 4 3 1 2 1 8 9 3 5 6 swap: 4 3 3 9 2 4 3 1 2 1 8 9 6 5 6 search: 4 3 3 9 2 4 3 1 2 1 8 9 6 5 6 swap: 4 3 3 1 2 4 3 1 2 9 8 9 6 5 6 search: 4 3 3 1 2 4 3 1 2 9 8 9 6 5 6 swap: 4 3 3 1 2 2 3 1 4 9 8 9 6 5 6 search: 4 3 3 1 2 2 3 1 4 9 8 9 6 5 6 (left > right) swap with pivot: 1 3 3 1 2 2 3 4 4 9 8 9 6 5 6

Analysis of quicksort—best case Suppose each partition operation divides the array almost exactly in half Then the depth of the recursion is log2n because that’s how many times we can halve n However, there are many recursions at each level! How can we figure this out? We note that Each partition is linear over its subarray All the partitions at one level cover the whole array

Partitioning at various levels

Best case II We cut the array size in half each time So the depth of the recursion is log2n At each level of the recursion, all the partitions at that level do work that is linear in n O(log2n) * O(n) = O(n log2n) What about the worst case?

Worst case In the worst case, partitioning always divides the size n array into these three parts: A length one part, containing the pivot itself A length zero part, and A length n-1 part, containing everything else We don’t recur on the zero-length part Recurring on the length n-1 part requires (in the worst case) recurring to depth n-1

Worst case partitioning

Worst case for quicksort In the worst case, recursion may be O(n) levels deep (for an array of size n). But the partitioning work done at each level is still O(n). O(n) * O(n) = O(n2) So worst case for Quicksort is O(n2) When does this happen? When the array is sorted to begin with!

Alternative Analysis Methods See Weiss sections 7.7.5

Typical case for quicksort If the array is sorted to begin with, Quicksort is terrible: O(n2) It is possible to construct other bad cases However, Quicksort is usually O(n log2n) The constants are so good that Quicksort is generally the fastest algorithm known Most real-world sorting is done by Quicksort

Tweaking Quicksort Almost anything you can try to “improve” Quicksort will actually slow it down One good tweak is to switch to a different sorting method when the subarrays get small (say, 10 or 12) Quicksort has too much overhead for small array sizes For large arrays, it might be a good idea to check beforehand if the array is already sorted But there is a better tweak than this

Picking a better pivot Before, we picked the first element of the subarray to use as a pivot If the array is already sorted, this results in O(n2) behavior It’s no better if we pick the last element Note that an array of identical elements is already sorted! What if we pick a random pivot? (analyzed by Weiss, Sec. 7.7.5) We could do an optimal quicksort (guaranteed O(n log n)) if we always picked a pivot value that exactly cuts the array in half Such a value is called a median: half of the values in the array are larger, half are smaller The easiest way to find the median is to sort the array and pick the value in the middle (!)

Median of three Obviously, it doesn’t make sense to sort the array in order to find the median to use as a pivot Instead, compare just three elements of our (sub)array—the first, the last, and the middle Take the median (middle value) of these three as pivot It’s possible (but not easy) to construct cases which will make this technique O(n2) Suppose we rearrange (sort) these three numbers so that the smallest is in the first position, the largest in the last position, and the other in the middle This lets us simplify and speed up the partition loop

Simplifying the inner loop Here’s the heart of the partition method: while (l < r) { while (l < right && a[l] < p) l++; while (r > left && a[r] >= p) r--; if (l < r) { int temp = a[l]; a[l] = a[r]; a[r] = temp; } } Because of the way we chose the pivot, we know that a[leftEnd] <= pivot <= a[rightEnd] Therefore a[l] < p will happen before l < right Likewise, a[r] >= p will happen before r > left Therefore the tests l < right and r > left can be omitted

Final comments Weiss’s code shows some additional optimizations on pp. 246-247. Weiss chooses to stop both searches on equality to pivot. This design decision is debatable. Quicksort is the fastest known general sorting algorithm, on average. For optimum speed, the pivot must be chosen carefully. “Median of three” is a good technique for choosing the pivot. There will be some cases where Quicksort runs in O(n2) time.