📜  插入排序时间复杂度问题

📅  最后修改于: 2021-04-28 00:03:38             🧑  作者: Mango

问题:插入排序需要多少时间以下面的形式对大小为n的数组进行排序?

arr [] = 2,1,4,3,6,5,…. i,i-1,…..n,n-1

答案:乍看之下,插入排序似乎要花O(n 2 )时间,但实际上要花O(n)时间

如何?让我们仔细看看下面的代码。

/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)
{
   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循环将运行到“ n”,而内部while循环将执行“恒定”步骤,即1次交换和2次比较。由于while循环需要固定的时间,for循环要对’n’个元素运行,因此总体复杂度为O(n)

替代答案:另一种查看方式是,插入排序所花费的时间与数组中的反转次数成正比。在上面的示例类型中,反转次数为n / 2,因此总时间复杂度为O(n)