Search and Sorting

https://slides.com/georgelee/ics141-algorithms-2/live

Recap

Searching

Linear Search

We go through each item in the array. If we find it, we return the index. Else, we return -1.

def search(value, numbers):
    for index, num in enumerate(numbers):
        if num == value:
            return index
        
    return -1

Binary Search

Assume the array is sorted. We look at the middle value of the array.

 

If it matches the value we're looking for, yay!

If the value is larger than the one we're searching for, we look in the first half.

Else, we look in the other half of the array.

Array [1 3 6 7 9], Find 9

 

Iteration 1:

Start: 0, End: 4, Middle: 2 -> [1 3 6 7 9] -> [1 3 6 7 9]

 

Iteration 2:

Start: 3, End: 4, Middle: 3 -> [1 3 6 7 9] -> [1 3 6 7 9]

 

Iteration 3:

Start 4, End: 4, Middle: 4 -> [1 3 6 7 9]

 

Result = 4

 

Array [1 3 6 7 9], Find 2

 

Iteration 1:

Start: 0, End: 4, Middle: 2 -> [1 3 6 7 9] -> [1 3 6 7 9]

 

Iteration 2:

Start: 0, End: 1, Middle: 0 -> [1 3 6 7 9] -> [1 3 6 7 9]

 

Iteration 3:

Start 1, End: 1 -> [1 3 6 7 9]

 

​Start 1, End: 0 ->  -1

 

Sorting

Sorting a list of numbers

  • A rite of passage for CS students
  • Given a list of numbers, sort them.
  • Non-recursive solutions

Bubble Sort

Given an array, we iterate from left to right. We compare numbers adjacent to each other. If the one on the left is bigger than the one on the right, we swap them.

 

The largest number "bubbles" to the end of the array. We iterate again to find the next biggest number.

 

Keep going until the array is sorted.

Sort the array [1, 4, 7, 2, 6]

Iteration 1:

[1 4 7 2 6] -> [1 4 7 2 6] -> [1 4 2 7 6] -> [1 4 2 6 7]


Iteration 2:

[1 4 2 6 7] -> [1 2 4 6 7] -> [1 2 4 6 7]


Iteration 3:

[1 4 2 6 7] -> [1 2 4 6 7]


Iteration 4:

[1 2 4 6 7]
def bubble_sort(array):
    for i in range(0, len(array) - 1):
        for j in range(0, len(array) - i - 1):
            if array[j] > array[j + 1]:
                array[j], array[j + 1] = array[j + 1], array[j]
                
    return array

Bubble Sort

Not even once

Insertion Sort

Split the array into a sorted and unsorted. Take the first unsorted value and "insert" it into the sorted array. Keep going until the entire array is sorted. Think about being dealt cards.

 

When inserting, the book goes from left to right.

 

My implementation will go from right to left.

 

Sort the array [3 1 7 4 2]

Iteration 1:

[3 1 7 4 2] -> [1 3 7 4 2] -> [1 3 7 4 2]

 

Iteration 2:

[1 3 7 4 2] -> [1 3 7 4 2]

 

Iteration 3:

[1 3 7 4 2] -> [1 3 4 7 2] -> [1 3 4 7 2]

 

Iteration 4:

[1 3 4 7 2] -> [1 3 4 2 7] -> [1 3 2 4 7] -> [1 2 3 4 7] -> [1 2 3 4 7]
def insertion_sort(array):
    # Assume first element is "sorted"
    for i in range(1, len(array)):
        value = array[i]
        position = i
        for j in range(i, -1, -1):
            if array[j - 1] <= value:
                break
                
            array[j] = array[j - 1]
            
        array[j] = value
                
    return array

Videos on Sorting

Greedy Algorithms

Greedy Algorithm

The idea is that whenever we are faced with a choice, we take the best one. We typically use these algorithms to solve optimization problems.

 

* Making Change

* The "Knapsack" problem

Algorithms: Search And Sorting

By George Lee

Algorithms: Search And Sorting

  • 929