0% found this document useful (0 votes)
22 views

03 Sorting

The document discusses several sorting algorithms including selection sort, insertion sort, bubble sort, merge sort, and quick sort. It provides descriptions of how each algorithm works and analyzes their time complexities, with merge sort and quick sort having average case performance of O(n log n) while the others are O(n^2).

Uploaded by

nttqn203
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views

03 Sorting

The document discusses several sorting algorithms including selection sort, insertion sort, bubble sort, merge sort, and quick sort. It provides descriptions of how each algorithm works and analyzes their time complexities, with merge sort and quick sort having average case performance of O(n log n) while the others are O(n^2).

Uploaded by

nttqn203
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 32

Sorting Algorithms

Outline
• Introduction
• Selection Sort
• Insertion Sort
• Bubble Sort
• Merge Sort
• Quick Sort
Introduction
• How do you find your name on a class list?
• How do you search a book in a library?
• How do you find a word in a dictionary?

• Search is very often operation


Introduction
• Unsorted list
• Sequential search algorithm
• Sorted list
• Binary search algorithm

• What is the difference of these algorithms?

• Sorting is important
Sorting
• Sorting is a process that organizes a collection of data
into either ascending or descending order.
• Formally
• Input: A sequence of n numbers <a1,a2,…,an>
• Output: A reordering <a’1,a’2,…,a’n> of the sequence such
that a’1 ≤ a’2 ≤ … ≤ a’n
• Given the input <6, 3, 1, 7>, the algorithm should produce
<1, 3, 6, 7>
Sorting Algorithms
• There are many sorting algorithms

• The fundamental sorting algorithms


– Selection Sort
– Insertion Sort
– Bubble Sort
– Merge Sort
– Quick Sort
Selection Sort
• Partition the input list into a sorted and unsorted
part (initially sorted part is empty)
• Select the smallest element and put it to the end of
the sorted part
• Increase the size of the sorted part by one
• Repeat this n-1 times to sort a list of n elements
Sorted Unsorted

23 78 45 8 32 56 Original List

After pass 1
8 78 45 23 32 56

8 23 45 78 32 56 After pass 2

After pass 3
8 23 32 78 45 56

After pass 4
8 23 32 45 78 56

After pass 5
8 23 32 45 56 78
Selection Sort
template <class Item>
void selectionSort(Item a[], int n) {
for (int i = 0; i < n-1; i++) {
int min = i;
for (int j = i+1; j < n; j++)
if (a[j] < a[min]) min = j;
swap(a[i], a[min]);
}
}

template < class Object>


void swap( Object &lhs, Object &rhs )
{
Object tmp = lhs;
lhs = rhs;
rhs = tmp;
}
Selection Sort -- Analysis
• What is the complexity of selection sort?
• Does it have different best, average, and worst case
complexities?
Selection Sort – Analysis (cont.)
• Selection sort is O(n2) for all three cases
• Therefore it is not very efficient
Insertion Sort

• The list is divided into two parts: sorted and


unsorted.
• In each pass, the first element of the unsorted part
is picked up, transferred to the sorted sublist, and
inserted at the appropriate place.
• A list of n elements will take at most n-1 passes to
sort the data.
Sorted Unsorted

23 78 45 8 32 56 Original List

After pass 1
23 78 45 8 32 56

23 45 78 8 32 56 After pass 2

After pass 3
8 23 45 78 32 56

After pass 4
8 23 32 45 78 56

After pass 5
8 23 32 45 56 78
Insertion Sort Algorithm
template <class Item>
void insertionSort(Item a[], int n)
{
for (int i = 1; i < n; i++)
{
Item tmp = a[i]; // the element to be inserted
int j;
for (j=i; j>0 && tmp < a[j-1]; j--)
a[j] = a[j-1]; // shift elements
a[j] = tmp; // insert
}
}
Insertion Sort – Analysis
• Running time depends on not only the size of the array but also
the contents of the array.
• Best-case: è O(n)
– Array is already sorted in ascending order.

• Worst-case: è O(n2)
– Array is in reverse order:

• Average-case: è O(n2)
– We have to look at all possible initial data organizations.
Bubble Sort
• n records are stored in an array A
• n steps in the bubble sorting algorithm
• During step i, A[0],A[1], …, A[i-1] are the
smallest i elements, arranged in sorted order
• Then among A[i],A[i+1], ... ,A[n-1], each pair
((A[n-2], A[n-1]) , …) will be exchanged if they
are out of order, so A[i] will be the smallest
o At step i, the smallest element bubbles
Bubble Sort

5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 0 5 5 5 5 1 1 1 1 1 1 1
7 7 7 0 1 1 1 1 1 5 5 5 4 4 4 4
4 4 0 7 7 7 7 4 4 4 4 4 5 5 5 5
0 0 4 4 4 4 4 7 7 7 6 6 6 6 6 6
6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7
Bubble Sort Algorithm
template <class Item>
void bubleSort(Item a[], int n)
{
bool sorted = false;
int last = n-1;

for (int i = 0; (i < last) && !sorted; i++){


sorted = true;
for (int j=last; j > i; j--)
if (a[j-1] > a[j]{
swap(a[j],a[j-1]);
sorted = false; // signal exchange
}
}
}
Bubble Sort – Analysis
• Best-case: è O(n)
– Array is already sorted in ascending order.
• Worst-case: è O(n2)
– Array is in reverse order:
• Average-case: è O(n2)
Merge sort
• Divide and Conquer algorithm
1. Cut the list in two halves
2. Sort each half, respectively, probably by merge sort
recursively
3. Merge the two sorted halves
Merge sort - Example

6 3 9divide
15472
6 3 9 1 5 4 7 2
divide divide
6 3 9 1 5 4 7 2

divide divide divide divide


6 3 9 1 5 4 7 2
merge merge merge merge

3 6 1 9 4 5 2 7
merge merge

1 3 6 9 2 4 5 7
merge

12345679
Merge two sorted lists

i j
b bi cj c

bi < cj
true, write bi false, write cj
i = i+1 j = j+1

result
Merge
const int MAX_SIZE = maximum-number-of-items-in-array;
void merge(DataType theArray[], int first, int mid, int last)
{
DataType tempArray[MAX_SIZE]; // temporary array
int first1 = first; // beginning of first subarray
int last1 = mid; // end of first subarray
int first2 = mid + 1; // beginning of second subarray
int last2 = last; // end of second subarray
int index = first1; // next available location in tempArray

for ( ; (first1 <= last1) && (first2 <= last2); ++index)


if (theArray[first1] < theArray[first2])
tempArray[index] = theArray[first1++];
else
tempArray[index] = theArray[first2++];
Merge (cont.)
// finish off the first subarray, if necessary
for (; first1 <= last1; ++first1, ++index)
tempArray[index] = theArray[first1];

// finish off the second subarray, if necessary


for (; first2 <= last2; ++first2, ++index)
tempArray[index] = theArray[first2];

// copy the result back into the original array


for (index = first; index <= last; ++index)
theArray[index] = tempArray[index];
}
Merge sort
void mergesort(DataType theArray[], int first, int last) {
if (first < last) { // more than one item
int mid = (first + last)/2; // index of midpoint
mergesort(theArray, first, mid);
mergesort(theArray, mid+1, last);

// merge the two halves


merge(theArray, first, mid, last);
}
} // end mergesort
Analysis of Merge sort
• What is the complexity of the merge operation for merging two
lists of size n/2?
• It is O(n) as we need to copy all elements
• Then the complexity of mergesort can be defined using the
following recurrence relation:
T(n) = 2T(n/2) + n
• Solving this relation gives us O(nlogn) complexity
• The complexity is the same for the best, worst, and average
cases
• The disadvantage of mergesort is that we need to use an extra
array for the merge operation (not memory efficient)
Quick Sort
• Divide and Conquer algorithm
• Two phases
ü Partition phase: Divide the list into half

< pivot pivot > pivot


ü Sort phase: Conquers the halves: apply the
same algorithm to each half
< pivot > pivot

< p’ p’ > p’ pivot < p” p” > p”


27
Example

28
Quick sort
template <class Element>
void quicksort(Element list[], int left, int right)
{ int i, j; Element pivot;
if (left < right) { /* divide */
i = left; j = right+1;
pivot = list[left];
do {
do i++; while (list[i] < pivot);
do j--; while (list[j] > pivot);
if (i < j) swap(list[i], list[j]);
} while (i < j);
swap(list[left], list[j]);
quicksort(list, left, j-1); /* conquer */
quicksort(list, j+1, right);
}
}
Analysis of Quick Sort
• Time complexity
Worst case: O(n2)
Best case: O(nlogn)
Average case: O(nlogn)
• Space complexity
Worst case: O(n)
Best case: O(logn)
Average case: O(logn)

30
Pivot Selection
• Which array item should be selected as pivot?
– If the items in the array arranged randomly, we choose a pivot
randomly.
– We can choose the first or last element as the pivot (it may not
give a good partitioning).
– We can choose the middle element as the pivot
– We can use a combination of the above to select the pivot (in
each recursive call a different technique can be used)
C/C++ Language Support
• We can implement sorting algorithms ourselves
• We can also use existing implementations
• In C, the function qsort (part of stdlib.h header) implements the
quicksort algorithm
• In C++ std::sort (part of algorithm header) implements a mixture
of quicksort, heapsort, and insertion sort

You might also like