插入排序的运行复杂度

时间:2018-10-20 12:06:04

标签: c big-o insertion-sort

在有关数据结构和算法的书中,插入排序的实现如下:

int insertionSort(void *data, int size, int esize, int(*compare)(const void *key1, const void *key2)){

    int i,j; 
    void *key,

    char *a = data;

    key = (char *) malloc(esize);

    if(key == NULL){
        return -1;
    }


    for(j=1; j<size; j++){
        memcpy(key, &a[j*esize], esize);
        i = j-1;

        while(i>=0 && compare(&a[i*esize], key)>0){
            memcpy(&a[(i+1)*esize],&a[i*esize], esize);
            i--;
        }

        memcpy(&a[(i+1)*esize], key, esize);


    }
}

因此,在有关复杂性的部分中,它声明了以下内容:

  

插入排序的运行时复杂度集中在其嵌套循环上。   考虑到这一点,外循环的运行时间为T(n)= n – 1   乘以一定的时间量,其中n是元素数   正在排序。在最坏的情况下检查内部循环,我们假设   我们必须一直到数组的左端   在将每个元素插入排序集中之前。因此,   内部循环可以为第一个元素迭代一次,为   第二,依此类推,直到外部循环终止。运行时间   嵌套循环的总和表示为1到n – 1的总和。   这导致运行时间为T(n)=(n(n + 1)/ 2)– n,倍   一些固定的时间。 (这是众所周知的公式   从1到n求和。)使用O表示法则,简化为O(n ^ 2)

因此,我在求和公式上进行了搜索,并了解了为什么是(n(n + 1)/ 2)。我也看了一堆有关此公式的youtube视频。 但是我无法理解书中T(n)的最后部分,即“ -n”部分。 为什么最后要减去n

0 个答案:

没有答案