使用插入排序

时间:2016-05-28 12:51:25

标签: insertion-sort

我尝试通过调用insort函数来实现插入算法。不知怎的,一路上我犯了一些错误,终端打印出分段错误。请帮忙。谢谢!

int 
main(int argv,char *argc[]){
    int A[argv-2];
    for(int i=1;i<argv;i++){
        A[i-1]=atoi(*(argc+i));
    }
    insort(&A,argv-1,0);
    for(int i=0;i<argv-1;i++){
        printf("%d",A[i]);
    }
    printf("\n");
    return 0;
}

int
insort(int *A[],int size,int n){
    int temp;
    if(n<size){
        for(int i=n;i>=0 && *(A+i)>*(A+i-1);i--){
            temp=*(A+i-1);
            *(A+i-1)=*(A+i);
            *(A+i)=temp;
        }
    }
    return insort(A,size,n++);
} 

1 个答案:

答案 0 :(得分:3)

编译任何程序时,请注意编译器发出的警告。

对于每个警告,您必须了解它的原因以及如何正确修复它。

$ gcc -std=c99 insort.c
insort.c:7:9: warning: implicit declaration of function 'atoi' [-Wimplicit-function-declaration]
insort.c:11:9: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]

要解决这些问题,请在最上方插入以下行:

#include <stdio.h> // for printf
#include <stdlib.h> // for atoi

下一个:

insort.c:10:5: warning: implicit declaration of function 'insort' [-Wimplicit-function-declaration]

要解决此问题,请将整个insort函数移到main函数上方。

下一个:

insort.c:23:17: warning: assignment makes integer from pointer without a cast

这个真的很糟糕。参数int *A[]实际上意味着int **A,它是指向int的指针。要解决此问题,请删除方括号。

下一个:

insort.c:22:12: warning: passing argument 1 of 'insort' from incompatible pointer type

&运算符不是必需的。将数组传递给函数时,它会衰减为指向数组开头的指针。删除&

现在,程序编译时没有给出任何警告。非常好。下一级:

$ gcc -std=c99 -Wall -Wextra -Os insort.c

哇。即使启用了所有这些警告,编译器也不会再抱怨了。那很好。

-Os优化选项是启用某些警告所必需的,因为它们仅在编译器优化代码时进行测试。)

现在程序编译。在运行它时,似乎陷入了无限循环。但是最糟糕的错误现在已经解决了。