为什么所有用于插入排序的解决方案都使用嵌套的while循环而不是嵌套的for?

问题描述

我正在尝试尝试插入算法问题。但是,我有以下问题。

我想了解为什么大多数在线解决方案都使用嵌套的while循环而不是嵌套的for循环?我认为这可能与时间复杂度有关,但是两者都具有O(n ^ 2)复杂度。

下面我附上了两种不同的解决方


public class InsertionSort { 
// MY method
    /*Function to sort array using insertion sort*/
    // void sort(int arr[]) 
    // { 
    //     int n = arr.length; 
    //     for (int i = 1; i < n; ++i) { 
    //         if(arr[i] < arr[i-1]){
    //             for(int j = 0; j < i; j++){
    //                 if(arr[i] < arr[j]){
    //                     int temp = arr[j];
    //                     arr[j] = arr[i];
    //                     arr[i] = temp;
    //                 }
    //             }
    //         }
    //     } 
    // } 

// Online Solution
  
    void sort(int arr[]) 
    { 
        int n = arr.length; 
        for (int i = 1; i < n; ++i) { 
            int key = arr[i]; 
            int j = i - 1; 
  
            /* Move elements of arr[0..i-1],that are 
               greater than key,to one position ahead 
               of their current position */
            while (j >= 0 && arr[j] > key) { 
                arr[j + 1] = arr[j]; 
                j = j - 1; 
            } 
            arr[j + 1] = key; 
        } 
    } 

解决方法

通常,在开发算法时,您将基于以下条件选择一个循环:

  • 如果知道迭代次数,请使用for循环。
  • 如果 的迭代次数未知,请使用while循环。

在Java和其他语言中,您可以使用两个循环来实现相同的事情。迭代次数是否已知并不重要。但是,这很有意义,它更具可读性/逻辑性:

  • ... 对于已知的起始值到已知的极限值...
  • ... 条件为真时...

pseudocode中,这是一种与实现细节无关地描述算法的方法,通常这样做(或类似):

for i = 0 to n do
    ...
while condition do
    ...

当您查看sort时,可以看到两个循环:外部for循环和内部while循环。

  • 外部循环是一个for循环,因为in是已知的。值n是已知的,因为它是由数组的大小给定的,该数组的大小在此算法中为常数。
  • 内部循环是while循环,因为未知条件何时失败,因为它取决于数组访问。您不知道这些值;如果可以的话,可以通过对一些交换进行硬编码来对数组进行排序。