问题描述
我正在尝试尝试插入算法问题。但是,我有以下问题。
我想了解为什么大多数在线解决方案都使用嵌套的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循环,因为
i
和n
是已知的。值n
是已知的,因为它是由数组的大小给定的,该数组的大小在此算法中为常数。 - 内部循环是while循环,因为未知条件何时失败,因为它取决于数组访问。您不知道这些值;如果可以的话,可以通过对一些交换进行硬编码来对数组进行排序。