问题:插入排序需要多少时间以下面的形式对大小为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)