Loop Invariant Condition with Examples of Sorting Algorithms

Loop Invariant Condition:
Loop invariant condition is a condition about the relationship between the variables of our program which is definitely true immediately before and immediately after each iteration of the loop.
For example: Consider an array A{7, 5, 3, 10, 2, 6} with 6 elements and we have to find maximum element max in the array.

max = -INF (minus infinite)
for (i = 0 to n-1)
  if (A[i] > max)
      max = A[i]

In the above example after 3rd iteration of the loop max value is 7, which holds true for first 3 elements of array A. Here, the loop invariant condition is that max is always maximum among the first i elements of array A.

Loop Invariant condition of various algorithms:
Prerequisite: insertion sort, selection sort, quick sort, bubblesort,

Selection Sort:
In selection sort algorithm we find the minimum element from the unsorted part and put it at the beginning.

min_idx = 0
 
for (i = 0; i < n-1; i++)
{
   min_idx = i;
   for (j = i+1 to n-1)
      if (arr[j] < arr[min_idx])
         min_idx = j;

    swap(&arr[min_idx], &arr[i]);
}

In the above pseudo code there are two loop invariant condition:
1. In the outer loop, array is sorted for first i elements.
2. In the inner loop, min is always the minimum value in A[i to j].



Insertion Sort:
In insertion sort, loop invariant condition is that the subarray A[0 to i-1] is always sorted.

for (i = 1 to n-1)
{
   key = arr[i];
   j = i-1;
   while (j >= 0 and arr[j] > key)
   {
      arr[j+1] = arr[j];
      j = j-1;
   }
   arr[j+1] = key;
}

Quicksort:
In quicksort algorithm, after every partition call array is divided into 3 regions:
1. Pivot element is placed at its correct position.
2. Elements less than pivot element lie on the left side of pivot element.
3. Elements greater than pivot element lie on the right side of pivot element.

quickSort(arr[], low, high)
{
    if (low < high)
    {
        pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);  // Before pi
        quickSort(arr, pi + 1, high); // After pi
    }
}

partition (arr[], low, high)
{
    pivot = arr[high];   
    i = (low - 1) 
    for (j = low; j <= high- 1; j++)
        if (arr[j] <= pivot)
            i++;   
            swap arr[i] and arr[j]
    swap arr[i + 1] and arr[high])
    return (i + 1)
}

Bubble Sort:
In bubble sort algorithm, after each iteration of the loop largest element of the array is always placed at right most position. Therefore, the loop invariant condition is that at the end of i iteration right most i elements are sorted and in place.

for (i = 0 to n-1)         
  for (j = 0 to j  arr[j+1])
       swap(&arr[j], &arr[j+1]);


My Personal Notes arrow_drop_up


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :
Practice Tags :



Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.