以下Insersion排序代码的复杂性是多少?

时间:2015-05-22 14:20:41

标签: sorting time-complexity insertion-sort space-complexity code-complexity

我为插入排序编写了以下代码。我决定通过函数调用来编写代码,而不是传统的方法。但我无法找到代码的复杂性。请帮助我找出时间和空间的复杂程度,以及与传统方法的不同之处。

#include <stdio.h>

void printArray(int ar_size, int *  ar){
    int j;
    for(j=0; j<ar_size; j++)
                printf("%d ", ar[j]);

        printf("\n");
}
void insertion(int ar_size, int *  ar, int p) {
    int last = p, j;
    int v = ar[last];

    for(int i=last; i>=0; i--){
        if(ar[i-1] > v){
            ar[i] = ar[i-1]; 
        }
        else{
            ar[i] = v;
            break;
        }     
    }
    printArray(ar_size, ar);
}

void insertionSort(int ar_size, int *  ar) {
    int i;
    for(i=1; i<ar_size; i++){
        insertion(ar_size, ar, i);
    }
}

int main(void) {

   int _ar_size;
scanf("%d", &_ar_size);
int _ar[_ar_size], _ar_i;
for(_ar_i = 0; _ar_i < _ar_size; _ar_i++) { 
   scanf("%d", &_ar[_ar_i]); 
}

insertionSort(_ar_size, _ar);

   return 0;
}

以下是插入排序的传统方法:

void InsertionSort(int a[], int n)
{
    int i,j, temp;
    for(i=0; i<=n-1; i++)
    {
        temp = a[i];
        j = i;
        while(a[j-1] > temp && j>=1)
        {
            a[j] = a[j-1];
            j--;
        }
        a[j] = temp;
    }   
}

1 个答案:

答案 0 :(得分:0)

您的代码的时间复杂度仍为O(n²)。将for循环内部移动到insertion函数不会改变复杂性。如果将insertion函数的内容复制并粘贴到调用它的循环中,则代码的运行时间没有差别(事实上,编译器可能在编译时为您完成此操作,因为优化的一部分)。

如果以这种方式查看代码,您会发现它在功能上与您提供的参考代码基本相同。

  1. 参考代码有一个从0到数组大小的外部循环,就像你的那样。
  2. 参考代码的内部循环从数组中的当前位置循环到开头,或直到找到更小的元素。你的代码调用一个函数来完成这个,只需更多的代码行。
  3. 从功能上讲,您的代码与参考插入排序实现基本相同;两者具有相同的时间复杂度,并且将在完全相同的一系列步骤中对数组进行排序。但是,参考实现可能稍微快一点,原因很简单,因为它没有做那么多的变量赋值,并且避免使用函数调用。

    在启用优化的情况下进行编译(默认情况下),应该使两段代码几乎完全相同。