【问题标题】:What will be complexity of the below Insersion sort code?以下插入排序代码的复杂性是多少?
【发布时间】:2015-05-22 14:20:41
【问题描述】:

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

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

【问题讨论】:

  • 也许我不明白你的问题是什么,但你可以简单地测量增加输入大小所需的时间,看看复杂性是什么。
  • @Kikit。考虑将其发布在代码审查堆栈交换上。该网站更适合让人们查看您现有的工作代码并提供您正在寻找的反馈。
  • @matrixugly 。有什么办法可以将这个问题转移到 Code Review Stack Exchange 或者我必须在那里重新发布?
  • @tobi303 。我只是想要我的代码的时间和空间复杂度。
  • 我只是测量一下

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


【解决方案1】:

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

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

  1. 参考代码有一个从 0 到数组大小的外循环,你的也是。
  2. 参考代码的内部循环从数组中的当前位置循环到开头,或者直到找到更小的元素。您的代码调用了一个函数来执行此操作,只需更多行代码。

在功能上,您的代码与引用插入排序实现基本相同;两者都具有相同的时间复杂度,并且会以完全相同的一系列步骤对数组进行排序。然而,参考实现可能会稍微快一点,因为它没有做太多的变量赋值,并且避免使用函数调用。

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

【讨论】:

  • 话虽如此,参考代码要短得多,而且它的作用更清晰。以更令人困惑的方式执行完全相同的事情的代码要长得多,这很少是一件好事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多