簡體   English   中英

插入排序的具體運行時復雜度是多少?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM