insertion sort

NOC16 CS11 www.youtube.com

Brief Summary

This lecture introduces insertion sort as an alternative sorting strategy. It details how insertion sort works by building a sorted sequence one element at a time, inserting each new element into its correct position within the sorted portion. The lecture also includes a Python implementation of insertion sort and analyzes its performance, noting that while it has a worst-case time complexity of O(n^2), it can perform much faster on nearly sorted or already sorted lists, unlike selection sort.

  • Insertion sort builds a sorted sequence by inserting elements into their correct positions.
  • A Python implementation of insertion sort is provided and explained.
  • Insertion sort has a worst-case time complexity of O(n^2), similar to selection sort.
  • Insertion sort performs better on nearly sorted lists compared to selection sort.

Introduction to Insertion Sort

The lecture introduces insertion sort as another sorting strategy, contrasting it with selection sort from the previous lecture. Insertion sort involves taking a stack of papers with marks and arranging them in descending order. The process begins by creating a new stack with the first paper, which is considered sorted by definition. Subsequent papers are then compared to those in the new stack and placed either above or below, maintaining the descending order.

How Insertion Sort Works

To sort using insertion sort, each subsequent paper is inserted into the correct position within the already sorted stack. For example, the third paper is compared to the first two to determine its correct placement—either on top, in between, or below. This is done by scanning from top to bottom until the correct position is found. The process continues for each remaining paper, inserting it into the appropriate position within the growing sorted stack.

Demonstration of Insertion Sort

The lecture demonstrates insertion sort using a list of numbers (74, 32, 89, 55, 21, 64). The first value, 74, is moved to the new stack. Then, 32 is placed to the left of 74 since it is smaller. The number 89 is bigger than both, so it stays on top. The number 55 is compared with 89 and 74, eventually settling between 32 and 74. Similarly, 21 is moved to the beginning of the list, and 64 is inserted between 55 and 74. This illustrates how insertion sort builds a sorted list by inserting each value into its correct position.

Insertion Sort Implementation in Python

The lecture transitions to a Python implementation of insertion sort, which sorts the sequence in place without building a new sequence. The code assumes that a portion of the sequence from 0 to n-1 is already sorted. The next element is picked up and moved left until its correct position is found, extending the sorted portion. The sliceend variable indicates the last position that is already sorted. The algorithm compares the value at sliceend with the value at the previous position and swaps them if the current value is smaller, continuing until the correct position is found.

Step-by-Step Execution of the Python Code

The lecture walks through the execution of the Python code on the example sequence. Initially, the list is considered unsorted, and the first element, 74, forms a sorted list of length one. The number 32 is then inserted before 74, resulting in a sorted list of 32, 74. The number 89 is already in the correct position. When 55 is inserted, it is compared and swapped until it reaches its correct position between 32 and 74. Similarly, 21 is swapped until it reaches the beginning of the list. The process stops either when the element finds a larger value to its left or when it reaches the beginning of the list.

Analysis of Insertion Sort

The analysis of insertion sort reveals that at each round, a new value is inserted into a sorted segment of length k. In the worst case, the value must be moved to the beginning of the segment, requiring k steps. This results in a time complexity of T(n) = 1 + 2 + 3 + ... + (n-1), which simplifies to n(n-1)/2, making insertion sort an O(n^2) algorithm in the worst case.

Practical Performance of Insertion Sort

The lecture discusses the practical performance of insertion sort using the Python interpreter. While insertion sort is generally slower for large, unsorted lists due to its O(n^2) complexity, it performs significantly better when the list is already sorted. In such cases, each insert step takes only one iteration because the value being inserted immediately finds that the value to its left is smaller, requiring no swapping. This makes insertion sort much faster than selection sort for nearly sorted lists, as selection sort always scans the entire sequence regardless of its initial order.

Summarize any YouTube video in seconds

Get summaries like this one for any video, in your language, with the free Summ app.

Download on the App Store
Get it on Google Play

Transcript

Full transcript of “insertion sort”. Click a timestamp to open the video at that moment. Need another video? Use the YouTube transcript generator.

0:03 In the previous lecture we saw one natural strategy for sorting, which you would apply when we do something by hand namely selection sort. Now let us look at another natural strategy which all of us use at some point. So, the second strategy is as follows: We have now a stack of papers remember with marks on them and we have to compute a new stack which has this marks arranged in descending order from top to bottom. So, we will take the first paper of the stack we have and create a new stack by definition this new stack is now sorted because it has only one paper. Now we pick the second paper from the old stack and we look at its marks as compared to the first paper that we pulled out. If it is smaller, we put it below; if it is higher, we put it above.

0:49 So, in this process, we now have the new stack of two papers arranged in descending order. What do we do with the third paper, well the third paper can be in one of three positions; it can either be bigger than the two we saw before. So it can go on top, or it could be in between the two, or it could go below. So, what we do is we scan from top to bottom and so longer if it is smaller than the paper we have seen, we push it down until we find a place where it fits. We insert the paper that we pick up next into the correct position into the already sorted stack we are building. So, keep doing this for each subsequent paper, we will take the fourth paper and insert into a correct position among the remaining three and so on. This is obviously called insertion sort. So, let us see how it would work.

1:35 So, what we do with this same list that we had for selection sort is we will pick up the first value and move it to the new stack saying now I have a new stack which has exactly one value namely 74. Then when I pick up 32, since 32 smaller than 74, I push it to the left of 74. Now 89 is bigger than both, so I keep it on top of the stack at the right end; 55, I have to now look with respect to 89 and 74, so it is smaller than 89. So, it goes to the left of 89 then I look at 74 it is smaller than 74 it goes to the left of that. So, eventually it settles down as 32, 55, 74, 89. 21, similarly I have to start from the top and say it is smaller than 89 smaller than 74 smaller than 55 smaller than 32, so it goes all the way to the left.

2:25 And finally, 64 will move down to positions past 84 and 89 and 74, but it will stop above 55. So, this is how insertion sort would build up a new list. You keep picking up the next value and inserting it into the already sorted list that you had before. We start building a sort sorted sequence with one element pick up the next unsorted element and insert it in to a correct place into the already sorted sequence. We can do this as we did with insertion sort without building a new sequence, and here is a function insertion sort defined in python which does this. So, what we will assume is that at any given point, we have our sequence from 0 to n minus

3:13 1 and there are some positions, so that up to this point everything is sorted. And now what I will do is I will pick up the next element here and I will move it left until I find the correct place to put it, so that now the sorted thing extends to this length right. So, we take a sorted sequence of length i and we extend it to a sec sorted sequence like i plus 1 by inserting in the i plus one th position in the current list. So, we are going to take this position the slice end right, the slice end is going to be the last position that we have sorted already. So, this is supposed to be slice end. So, we say sliceend it starts from the value 0 and goes up to the n minus 1th position.

4:02 And at each time, we look at the value at. Actually the slice is up to sliceend minus 1 sorry. So, sliceend is a number of elements that we have sorted. We look at the value immediately after that which will be in the position called sliceend and so long as this position is bigger than 0; and if the value at that position is strictly smaller than the value at the previous position, we exchange these two right. So, what we were doing is that we are saying we draw it again. We have an already sorted slice to from 0 to slice n minus 1, and we have this position sliceend. We then assume that this is sorted.

4:48 So, we compare with this value and if this is smaller then we exchange it. Now if you have exchanged it that means, that this value has now gone here. Now, we again a compare it to the previous value, and if it is smaller we exchange it. So, again this means that it goes one more position. We just keep going until we find that at this position the value to the left of it is equal to or bigger than this sorry equal to or smaller than this. So, we should not swap it and we have it in the correct position right, so that is what this is doing. So long as you have not reached the left hand end, you compare the value you are looking at now to the value to its left; with the value to its left is strictly bigger, this one must exchange and then you decrement the position. Let us run this the way we have written it on this particular sequence.

5:35 So, what we do is we initially assume that this thing is unsorted. So, our first thing is here. And so when we sort it, we just get a sorted list of length one which is 74. Then we look at this and we must insert it into this list 74. So since this is smaller than 74, it gets exchanged and we get now new sorted list 32, 74 and now we must insert 89 into this list right and now we see 89 is bigger than 74, so nothing happens. This list now I sorted from 32 to 89, now we try to insert 55 in this. We first compare it with this, and this will say that 55 is smaller than the value to its left, so we must exchange. Now we will compare 55 again to the value to its left again, we will exchange.

6:21 Now we will compare 55 to the value to its left and there is no change. Now we have a sorted list of length 4. Similarly, we will take 21 right, and we will compare it to 89; since 21 is smaller than 89, it will swap; since 21 is smaller than 74, it will again swap; since 21 is smaller than 55, it will swap; since 21 is smaller than 32, it will swap, but now the position sorry will swap and now the position is 0. So, we stop not because we have found something to the left which is bigger, but because we have nothing to the left. We have two conditions if you remember that algorithm is said that either pos should be positive, the position should be greater than 0 or we should compare it to the value on

7:08 its left right. In this case, we have no value to its left, so we stop. How do we analyze this? Well, at each round, what are we doing, we are inserting a new value into a sorted segment of length k. So, we start with the length 0 segment, we insert one value to it, we get a sorted length of sequence of length one, we insert a value into that we get a sorted sequence of length two and so on. Where in the worst case, when we are inserting we have to take the value all the way to the beginning of the segment. Sorting a segment of length k in the worst case takes k steps, so again we have the same recurrence not expression that we had for selection sort says that T of n is 1 plus 2 plus 3 up to n minus 1 which is n into n minus 1 by 2 which is order n square.

7:57 So, again remember that this is n square by 2 minus n by 2 and so this is the biggest term and that is what we get. Once again let us see how insertion sort actually works in the python interpreter and we will see something slightly different from selection sort when we run it. First, let us look at the code. This is the code that we saw in the slide. We just keeps scanning segments, keeps taking a value at a position and inserting it into the already sorted sequence up to that position. If we start the python interpreter, and say import this function, then as before if we

8:43 for example, take a long list and sort it then l becomes sorted. So, before l was in descending order. Now we sort it, and now l is in ascending order. Now as before what we said is that if we try to do this for a length of around 5000 then it will be much smaller and much slower right. So, you can see it takes a long time and that is because InsertionSort, it is again order n square sort. So, though it does it eventually it takes a long time, But there is a small difference here.

9:29 So, suppose we do it the other way, suppose we take a list which is already sorted, and now we ask it to sort, then it comes back instantly. Why should this be the case well think about what is happening now the list is already in sorted order. So, when we try to take a value at any position and move it to the left, it immediately finds that the value to its left is smaller than it, so no swapping occurs. So, each insert step takes only one iteration. It does not have to go through anything beyond the first element in order to stop the insert step. So, actually if we take even a large value like 10,000 or even 100000 this should work. Insertion sort when you already have a sorted list will be quite fast because the insert step is instantaneous whereas this does not happen with selection sort.

10:18 Because in selection sort, in each iteration we have to find the minimum value in a cell in a sequence and with no prior knowledge about what the sequence looks like it will always scan the sequence from beginning to end. The worst case for selection sort, will happen regardless of whether the input is already sorted or not; whereas insertion sort if the list is sorted, the insert step will be very fast, and so you can if actually sort larger things. In that sense insertion sort can be behave much better than selection sort even though both of them technically in the worst case are order n squared sorts.

Share

More video summaries