[英]What is the specific runtime complexity of insertion sort?
我只是回顧了一些基本的排序算法。 我實現了下面的插入排序。
public static int[] insertionSort(int[] arr){
int I = 0;
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < i; j++){
if(arr[i] < arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
I++;
}
}
System.out.println(I);
return arr;
}
I
為一個大小為 100 的數組打印出 4950,其中包含 100 個隨機生成的整數。
我知道該算法被認為是 O(n^2),但是在算術上更正確的運行時間是什么? 如果I
假設它實際上是 O(N^2),將打印出 10,000 而不是 4950。
Big-Oh 表示法為我們提供了算法在輸入大小變大時必須做的工作量。 單個輸入測試沒有提供足夠的信息來驗證理論上的 Big-Oh。 您應該在從 100 到 100 萬的不同大小的 arrays 上運行算法,並繪制 output 圖形,其中數組的大小作為 x 變量,代碼輸出的步數作為 y 變量。 執行此操作時,您會看到圖形是拋物線。
您可以使用代數來獲得盡可能接近此數據的y = a*x^2 + b*x +c
形式的 function。 但是使用 Big-Oh 表示法,我們不關心較小的術語,因為它們與x^2
部分相比變得微不足道。 例如,當x = 10^3
時, x^2 = 10^6
遠大於b*x + c
。 如果x = 10^6
那么x^2 = 10^12
又比b*x + c
,我們可以忽略這些較小的項。
您可以進行以下觀察: 在外循環的第i
次迭代中,內循環運行i
次,因為i
從 0 到 n-1,其中 n 是數組的長度。
在整個算法中,內循環總共運行 T(n) 次,其中
T(n) = 0 + 1 + 2 + ... + (n-1)
這是一個算術級數,很容易證明和等於n
上的二次多項式:
T(n) = n*(n-1)/2 = .5*n^2 - .5*n
對於 n = 100,公式預測內部循環將運行 T(100) = 100*99/2 = 4950 次,這與您的計算結果相匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.