寻找插入排序的大O时间复杂度
Finding big-o time complexity of insertion sort
本书是这样计算插入排序的时间复杂度的:
令T(n) 表示插入排序的复杂度,c 表示每次迭代中其他操作(例如赋值和附加比较)的总数。因此,
T(n) = (2 + c) + (2 * 2 + c) + . . . + (2 * (n - 1) + c) ---> (1)
= 2(1 + 2 + . . . + n - 1) + c(n - 1) ---> (2)
= 2((n - 1)n/2) + cn - c = n2 - n + cn - c ---> (3)
= O(n2) ---> (4)
第一步我看不懂。每个术语中的'2'来自哪里。
请尽可能简单的解释(数学很难)。
算法:
public class InsertionSort {
/** The method for sorting the numbers */
public static void insertionSort(double[] list) {
for (int i = 1; i < list.length; i++) {
/** insert list[i] into a sorted sublist list[0..i-1] so that
list[0..i] is sorted. */
double currentElement = list[i];
int k;
for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
list[k + 1] = list[k];
}
// Insert the current element into list[k+1]
list[k + 1] = currentElement;
}
}
}
2
是一个可能的定义。算法的处理分为几步。可以说他在for循环中一步计算比较,一步赋值。
而且你看到你有一个嵌套循环。所以为了更好的阅读,我将外循环命名为 i-loop,将内循环命名为 j_i-loop。处理 j_i-loop 的时间是 2 * (i -1)
。处理 i-loop 的时间是处理 (j_1-loop +c)+(j_2-loop +c)+...+(j_n-loop+c)
.
的时间
现在你在第一行得到了术语。
本书是这样计算插入排序的时间复杂度的:
令T(n) 表示插入排序的复杂度,c 表示每次迭代中其他操作(例如赋值和附加比较)的总数。因此,
T(n) = (2 + c) + (2 * 2 + c) + . . . + (2 * (n - 1) + c) ---> (1) = 2(1 + 2 + . . . + n - 1) + c(n - 1) ---> (2) = 2((n - 1)n/2) + cn - c = n2 - n + cn - c ---> (3) = O(n2) ---> (4)
第一步我看不懂。每个术语中的'2'来自哪里。
请尽可能简单的解释(数学很难)。
算法:
public class InsertionSort {
/** The method for sorting the numbers */
public static void insertionSort(double[] list) {
for (int i = 1; i < list.length; i++) {
/** insert list[i] into a sorted sublist list[0..i-1] so that
list[0..i] is sorted. */
double currentElement = list[i];
int k;
for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
list[k + 1] = list[k];
}
// Insert the current element into list[k+1]
list[k + 1] = currentElement;
}
}
}
2
是一个可能的定义。算法的处理分为几步。可以说他在for循环中一步计算比较,一步赋值。
而且你看到你有一个嵌套循环。所以为了更好的阅读,我将外循环命名为 i-loop,将内循环命名为 j_i-loop。处理 j_i-loop 的时间是 2 * (i -1)
。处理 i-loop 的时间是处理 (j_1-loop +c)+(j_2-loop +c)+...+(j_n-loop+c)
.
现在你在第一行得到了术语。