有谁能告诉我这个代码如何对数组进行排序?我不明白!以及这段代码如何降低常规插入排序的复杂性?
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected sould be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j+1] = a[j];
j--;
}
a[j+1] = selected;
}
}
答案 0 :(得分:2)
此代码使用的事实是,数组中从零(包括零)到i
的排除部分已经排序。这就是为什么它可以为binarySearch
的插入位置运行a[i]
,而不是线性搜索它。
这个聪明的技巧不会改变算法的渐近复杂性,因为移动loc
到i
的元素的部分保持线性。在最坏的情况下(当数组反向排序时会发生),每个N
插入步骤将使i
移动,总共N(N-1)/ 2次移动。
此算法相对于经典插入排序的唯一改进是比较次数。如果对被排序对象的比较计算成本很高,则该算法可以显着降低常数因子。