58
Data Structures and Algorithms Lecture __ : Sorting Algorithms Original Author of the lecture slides: Dr. Sohail Aslam

Ds lect 24 -sorting - ii

Embed Size (px)

Citation preview

Page 1: Ds   lect 24 -sorting - ii

Data Structures and Algorithms

Lecture __ : Sorting Algorithms

Original Author of the lecture slides: Dr. Sohail Aslam

Page 2: Ds   lect 24 -sorting - ii

Sorting Algorithms:

Divide and Conquer Strategy

Merge Sort

Quick Sort

Page 3: Ds   lect 24 -sorting - ii

Divide and Conquer Strategy

What if we split the list into two parts?

10 12 8 4 2 11 7 510 12 8 4 2 11 7 5

Page 4: Ds   lect 24 -sorting - ii

Divide and Conquer

Sort the two parts:

10 12 8 4 2 11 7 54 8 10 12 2 5 7 11

Page 5: Ds   lect 24 -sorting - ii

Divide and Conquer

Then merge the two parts together:

4 8 10 12 2 5 7 112 4 5 7 8 10 11 12

Page 6: Ds   lect 24 -sorting - ii

Analysis

To sort the halves (n/2)2+(n/2)2

To merge the two halves n

So, for n=100, divide and conquer takes:

= (100/2)2 + (100/2)2 + 100

= 2500 + 2500 + 100

= 5100 (n2 = 10,000)

Page 7: Ds   lect 24 -sorting - ii

Divide and Conquer

Why not divide the halves in half?

The quarters in half?

And so on . . .

When should we stop?

At n = 1

Page 8: Ds   lect 24 -sorting - ii

Search

Divide and Conquer

Search

Search

Recall: Binary Search

Page 9: Ds   lect 24 -sorting - ii

Sort

Divide and Conquer

Sort Sort

Sort Sort Sort Sort

Page 10: Ds   lect 24 -sorting - ii

Divide and Conquer

Combine

Combine Combine

Page 11: Ds   lect 24 -sorting - ii

Merge Sort

Page 12: Ds   lect 24 -sorting - ii

Mergesort

Mergesort is a divide and conquer algorithm that

does exactly that.

It splits the list in half

Mergesorts the two halves

Then merges the two sorted halves together

Mergesort can be implemented recursively

Page 13: Ds   lect 24 -sorting - ii

Mergesort

The mergesort algorithm involves three steps:

If the number of items to sort is 0 or 1, return

Recursively sort the first and second halves

separately

Merge the two sorted halves into a sorted

group

Page 14: Ds   lect 24 -sorting - ii

Merging: animation

4 8 10 12 2 5 7 11

2

Page 15: Ds   lect 24 -sorting - ii

Merging: animation

4 8 10 12 2 5 7 11

2 4

Page 16: Ds   lect 24 -sorting - ii

Merging: animation

4 8 10 12 2 5 7 11

2 4 5

Page 17: Ds   lect 24 -sorting - ii

Merging

4 8 10 12 2 5 7 11

2 4 5 7

Page 18: Ds   lect 24 -sorting - ii

Mergesort

8 12 11 2 7 5410

Split the list in half.

8 12410

Mergesort the left half.

Split the list in half. Mergesort the left half.

410

Split the list in half. Mergesort the left half.

10

Mergesort the right.

4

Page 19: Ds   lect 24 -sorting - ii

Mergesort

8 12 11 2 7 5410

8 12410

410

Mergesort the right half.

Merge the two halves.

104 8 12

128

Merge the two halves.

88 12

Page 20: Ds   lect 24 -sorting - ii

Mergesort

8 12 11 2 7 5410

8 12410

Merge the two halves.

410

Mergesort the right half. Merge the two halves.

104 8 12

10 1284

104 8 12

Page 21: Ds   lect 24 -sorting - ii

Mergesort

10 12 11 2 7 584

Mergesort the right half.

11 2 7 5

11 2

11 2

Page 22: Ds   lect 24 -sorting - ii

Mergesort

10 12 11 2 7 584

Mergesort the right half.

11 2 7 5

11 22 11

2 11

Page 23: Ds   lect 24 -sorting - ii

Mergesort

10 12 11 2 7 584

Mergesort the right half.

11 2 7 52 11

75

7 5

Page 24: Ds   lect 24 -sorting - ii

Mergesort

10 12 11 2 7 584

Mergesort the right half.

11 2 572 11

Page 25: Ds   lect 24 -sorting - ii

Mergesort

10 12 2 5 7 1184

Mergesort the right half.

Page 26: Ds   lect 24 -sorting - ii

Mergesort

5 7 8 10 11 1242

Merge the two halves.

Page 27: Ds   lect 24 -sorting - ii

void mergeSort(float array[], int size)

{

int* tmpArrayPtr = new int[size];

if (tmpArrayPtr != NULL)

mergeSortRec(array, size, tmpArrayPtr);

else

{

cout << “Not enough memory to sort list.\n”);

return;

}

delete [] tmpArrayPtr;

}

Mergesort

Page 28: Ds   lect 24 -sorting - ii

void mergeSortRec(int array[],int size,int tmp[])

{

int i;

int mid = size/2;

if (size > 1){

mergeSortRec(array, mid, tmp);

mergeSortRec(array+mid, size-mid, tmp);

mergeArrays(array, mid, array+mid, size-mid,

tmp);

for (i = 0; i < size; i++)

array[i] = tmp[i];

}

}

Mergesort

Page 29: Ds   lect 24 -sorting - ii

3 5 15 28 30 6 10 14 22 43 50a: b:

aSize: 5 bSize: 6

mergeArrays

tmp:

Page 30: Ds   lect 24 -sorting - ii

mergeArrays

5 15 28 30 10 14 22 43 50a: b:

tmp:

i=0

k=0

j=0

3 6

Page 31: Ds   lect 24 -sorting - ii

mergeArrays

5 15 28 30 10 14 22 43 50a: b:

tmp:

i=0

k=0

3

j=0

3 6

Page 32: Ds   lect 24 -sorting - ii

mergeArrays

3 15 28 30 10 14 22 43 50a: b:

tmp:

i=1 j=0

k=1

3 5

5 6

Page 33: Ds   lect 24 -sorting - ii

mergeArrays

3 5 28 30 10 14 22 43 50a: b:

3 5tmp:

i=2 j=0

k=2

6

15 6

Page 34: Ds   lect 24 -sorting - ii

mergeArrays

3 5 28 30 6 14 22 43 50a: b:

3 5 6tmp:

i=2 j=1

k=3

15 10

10

Page 35: Ds   lect 24 -sorting - ii

10

mergeArrays

3 5 28 30 6 22 43 50a: b:

3 5 6tmp:

i=2 j=2

k=4

15 10 14

14

Page 36: Ds   lect 24 -sorting - ii

1410

mergeArrays

3 5 28 30 6 14 43 50a: b:

3 5 6tmp:

i=2 j=3

k=5

15 10 22

15

Page 37: Ds   lect 24 -sorting - ii

1410

mergeArrays

3 5 30 6 14 43 50a: b:

3 5 6tmp:

i=3 j=3

k=6

15 10 22

2215

28

Page 38: Ds   lect 24 -sorting - ii

1410

mergeArrays

3 5 30 6 14 50a: b:

3 5 6tmp:

i=3 j=4

k=7

15 10 22

2815

28 43

22

Page 39: Ds   lect 24 -sorting - ii

1410

mergeArrays

3 5 6 14 50a: b:

3 5 6tmp:

i=4 j=4

k=8

15 10 22

3015

28 43

22

30

28

Page 40: Ds   lect 24 -sorting - ii

1410

mergeArrays

3 5 6 14 50a: b:

3 5 6 30tmp:

i=5 j=4

k=9

15 10 22

15

28 43

22

30

28 43 50

Done.

Page 41: Ds   lect 24 -sorting - ii

Merge Sort and Linked Lists

Sort Sort

Merge

Page 42: Ds   lect 24 -sorting - ii

Mergesort Analysis

Merging the two lists of size n/2:

O(n)

Merging the four lists of size n/4:

O(n).

.

.Merging the n lists of size 1:

O(n)

O (lg n)times

Page 43: Ds   lect 24 -sorting - ii

Mergesort Analysis

Mergesort is O(n lg n)

Space?

The other sorts we have looked at (insertion,

selection) are in-place (only require a constant

amount of extra space)

Mergesort requires O(n) extra space for merging

Page 44: Ds   lect 24 -sorting - ii

Quick Sort

Page 45: Ds   lect 24 -sorting - ii

Quicksort

Quicksort is another divide and conquer algorithm

based on the idea of partitioning (splitting) the list

around a pivot or split value

Page 46: Ds   lect 24 -sorting - ii

Quicksort

First the list is partitioned around a pivot value. Pivot can be chosen from the beginning, end or middle of list):

8 32 11 754 10124 5

5

pivot value

Page 47: Ds   lect 24 -sorting - ii

Quicksort

The pivot is swapped to the last position and the remaining elements are compared starting at theends.

8 3 2 11 7 54 10124 5

low high

5

pivot value

Page 48: Ds   lect 24 -sorting - ii

Quicksort

Then the low index moves right until it is at an element that is larger than the pivot value (i.e., it is on the wrong side)

8 6 2 11 7 510124 6

low high

5

pivot value

312

Page 49: Ds   lect 24 -sorting - ii

Quicksort

Then the high index moves left until it is at an element that is smaller than the pivot value (i.e., it is on the wrong side)

8 6 2 11 7 54 10124 6

low high

5

pivot value

3 2

Page 50: Ds   lect 24 -sorting - ii

Quicksort

Then the two values are swapped and the index values are updated:

8 6 2 11 7 54 10124 6

low high

5

pivot value

32 12

Page 51: Ds   lect 24 -sorting - ii

Quicksort

This continues until the two index values pass each other:

8 6 12 11 7 5424 6

low high

5

pivot value

3103 10

Page 52: Ds   lect 24 -sorting - ii

Quicksort

This continues until the two index values pass each other:

8 6 12 11 7 5424 6

low high

5

pivot value

38 103

Page 53: Ds   lect 24 -sorting - ii

Quicksort

This continues until the two index values pass each other:

12 11 7 5424

lowhigh

5

pivot value

8 103

Page 54: Ds   lect 24 -sorting - ii

Quicksort

This continues until the two index values pass each other:

8 6 12 11 7 5424 6

lowhigh

5

pivot value

103

Page 55: Ds   lect 24 -sorting - ii

Quicksort

This continues until the two index values pass each other:

8 6 12 11 7 5424 6

lowhigh

5

pivot value

103

Page 56: Ds   lect 24 -sorting - ii

Quicksort

Then the pivot value is swapped into position:

8 6 12 11 7 5424 6

lowhigh

103 85

Page 57: Ds   lect 24 -sorting - ii

Quicksort

Recursively quicksort the two parts:

5 6 12 11 7 8424 6103

Quicksort the left part Quicksort the right part

5

Page 58: Ds   lect 24 -sorting - ii

Heap-Sort

template <class eType>

void Heap<eType> :: sort()

{

int m = currentSize;

int i=0;

eType minItem;

while(m>=2)

{

minItem = array[ 1 ];

//swap root item with last child

array[1] = array[m];

array[m] = minItem;

m--;

percolateDown( 1, m );

}

}