java - 为什么插入排序只有在我们使用 while 作为内循环时才起作用,而对“for 循环”不起作用?

标签 java algorithm sorting insertion-sort

<分区>

我试图尝试一道插入算法题。但是,我有以下问题。

我想知道为什么大多数在线解决方案都使用嵌套 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 循环,因为它不知道条件何时会失败,因为它取决于数组访问。你不知道值(value)观;如果愿意,您可以通过对一些交换进行硬编码来对数组进行排序。

关于java - 为什么插入排序只有在我们使用 while 作为内循环时才起作用,而对“for 循环”不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63645255/

相关文章:

algorithm - 基于lambda的将向量拆分为多个较小向量的STL算法

arrays - 如何判断两个乱序的长字符串数组是否完全相等?

ios - 它对 NSMutableArray 进行排序吗?

java - Scala如何将 "None"排序到底部(如果存在)并选择每组中的第一行?

php - Zen Cart 将 MySQL 结果放入 MoveNext() 标签内的数组中

java - 使用鼠标输入

java - 在java中将多种数据类型存储到一个数组/表的最佳方法

algorithm - 二叉堆和二叉堆有什么区别?

java - EclipseLink 在 OneToMany 关系中找不到实体

java - 通过另一个类中的列表输出数据库信息 - Eclipse Android SQLite