试图理解二进制插入排序?

时间:2015-03-29 11:00:42

标签: c++ algorithm sorting binary-search

有谁能告诉我这个代码如何对数组进行排序?我不明白!以及这段代码如何降低常规插入排序的复杂性?

// 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;
    }
}

1 个答案:

答案 0 :(得分:2)

此代码使用的事实是,数组中从零(包括零)到i的排除部分已经排序。这就是为什么它可以为binarySearch的插入位置运行a[i],而不是线性搜索它。

这个聪明的技巧不会改变算法的渐近复杂性,因为移动loci的元素的部分保持线性。在最坏的情况下(当数组反向排序时会发生),每个N插入步骤将使i移动,总共N(N-1)/ 2次移动。

此算法相对于经典插入排序的唯一改进是比较次数。如果对被排序对象的比较计算成本很高,则该算法可以显着降低常数因子。