我为插入排序编写了以下代码。我决定通过函数调用来编写代码,而不是传统的方法。但我无法找到代码的复杂性。请帮助我找出时间和空间的复杂程度,以及与传统方法的不同之处。
#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;
}
}
答案 0 :(得分:0)
您的代码的时间复杂度仍为O(n²)。将for循环内部移动到insertion
函数不会改变复杂性。如果将insertion
函数的内容复制并粘贴到调用它的循环中,则代码的运行时间没有差别(事实上,编译器可能在编译时为您完成此操作,因为优化的一部分)。
如果以这种方式查看代码,您会发现它在功能上与您提供的参考代码基本相同。
从功能上讲,您的代码与参考插入排序实现基本相同;两者具有相同的时间复杂度,并且将在完全相同的一系列步骤中对数组进行排序。但是,参考实现可能稍微快一点,原因很简单,因为它没有做那么多的变量赋值,并且避免使用函数调用。
在启用优化的情况下进行编译(默认情况下),应该使两段代码几乎完全相同。