308-203a introduction to computing ii lecture 8: sorting 2 fall session 2000

Post on 18-Dec-2015

216 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

308-203AIntroduction to Computing II

Lecture 8: Sorting 2

Fall Session 2000

So far….

1. Bubblesort - intuitive implementation

(n2) suboptimal

2. MergeSort - Divide-and-Conquer

O(n log n) worst-case optimal

The Problem with MergeSort

We do a lot of copying when we MERGE…

8, 34, 51, 78, 82 2, 17, 64, 91, 123

2, 8, 17, 34, 51, 64, 78, 82, 91, 123

N/2 N/2

New Array: size = N

In Java, for example...

int [] merge(int [] a, int [] b){ int [] c = new int [a.length + b.length];

// merge a and b into c ….

return c;}

The Problem with MergeSort

• To merge we need O(n) extra space

• Copying bigger “hidden constants”

• “Sorting-in-place” would be preferable (if we can do it in optimal n log n)

• Divide-and-Conquer was good, can we do the same thing with an operation other than merge??

Quicksort

64, 8, 78, 34, 82, 51, 17, 2, 91, 123

2. Recursion

2. Partition

1. Pick pivot

2, 8, 17, 34, 51, 64, 78, 82, 91, 123

8, 34, 51, 17, 2 , 64, 78, 82, 91, 123

Quicksort

Quicksort(int [] A, int start, int end){ int pivot = A[0];

int midpoint = Partition(pivot, A);

Quicksort(A, start, midpoint); Quicksort(A, midpoint+1, end);}

Running Time

• Depends significantly on choice of pivot

• Worst-case = O(n2)

• Best-case = O( n log n)

Proofs on separate handout

The Worst-Case is WORSE!

• Worst-case is O(n2) as bad as Bubblesort

• A clever trick:Fooling-the-Adversary

1. pick a random pivot2. You hit a bad case only when very unlucky

• Average-case = O( n log n)

Proof beyond the scope of this course

Randomized Quicksort

Quicksort(int [] A, int start, int end){ int pivot = A[ randomInt(start, end) ];

int midpoint = partition(pivot, A);

Quicksort(A, start, midpoint); Quicksort(A, midpoint+1, end);}

Any questions?

top related