Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当使用两个不同的编译器时,我得到了不同的输出_C_Quicksort - Fatal编程技术网

C 当使用两个不同的编译器时,我得到了不同的输出

C 当使用两个不同的编译器时,我得到了不同的输出,c,quicksort,C,Quicksort,我有一个让我困惑的代码。所以,我制作了一个源代码,它将进行一些分区(就像快速排序一样),并在pivot的左右两侧进行排序。但是,我的问题是,当我把它提交给在线评委时,它给了我错误的答案(但在我的代码中,我已经尝试过了,它给出了确切的输出结果)。这是我的源代码: #include "stdio.h" int partition(int arr[],int left, int right); void swap(int *a, int *b); void quickSort(int arr[],i

我有一个让我困惑的代码。所以,我制作了一个源代码,它将进行一些分区(就像快速排序一样),并在pivot的左右两侧进行排序。但是,我的问题是,当我把它提交给在线评委时,它给了我错误的答案(但在我的代码中,我已经尝试过了,它给出了确切的输出结果)。这是我的源代码:

#include "stdio.h"

int partition(int arr[],int left, int right);
void swap(int *a, int *b);
void quickSort(int arr[],int left, int right);

int main()
{
    int sizeArr,arr[1005], pv;
    scanf("%d",&sizeArr); getchar();

    for(int i = 0; i < sizeArr; i++){
        scanf("%d",&arr[i]); getchar();
    }

    pv = partition(arr,0,sizeArr);
    quickSort(arr,0,pv);
    quickSort(arr,pv + 1, sizeArr);

    printf("%d",arr[0]);
    for(int i = 1; i < sizeArr; i++) printf(" %d",arr[i]);
    printf("\n");

    return 0;
}

int partition(int arr[],int left, int right){
    int pv = left;
    if(left < right){
        pv = left;
        int l = left;
        int r = right + 1;
        do{
            do l++; while(arr[l] < arr[pv]);
            do r--; while(arr[r] > arr[pv]);
            if (l < r) swap(&arr[l],&arr[r]);
        } while(l < r);
        swap(&arr[pv],&arr[r]);
        return arr[pv];
    }
}

void quickSort(int arr[],int left, int right){
    if(left < right){
        int pv = left;
        int l = left;
        int r = right + 1;
        do{
            do l++; while(arr[l] < arr[pv]);
            do r--; while(arr[r] > arr[pv]);
            if (l < r) swap(&arr[l],&arr[r]);
        } while(l < r);
        swap(&arr[pv],&arr[r]);
        quickSort(arr, left, r - 1);
        quickSort(arr, r + 1, right);
    }
}

void swap(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
GCC 4.9.2 64位版本的输出:

0 2 3 4 5
2 3 4 5 7
GCC 4.9.2 32位版本的输出:

0 2 3 4 5
2 3 4 5 7

left>=right
时,函数将不返回值:(请参阅底部注释中的建议。)

正如注释中所提到的,编译器警告可以帮助您及早发现这些问题。将编译器警告设置为最严格的级别。例如 我将编译器警告设置为ALL(CLANG),它在代码中显示了这一点:

循环,如
dol++;while(arr[l]
可能会调用UB运行数组边界的aut您的函数
partition()
在所有情况下都不会返回值。UB意味着一切都可能发生。打开编译器警告,您将知道问题所在away@ryyker不,在所有代码路径中返回正确的值失败是一件很简单的事情,所有体面的编译器都会警告您开始使用
gcc-std=c11-pedantic errors-Wall-Wextra
正确编译的时间。在这种情况下,缺少的
-Wall
隐藏了错误。
pv = partition(arr,0,sizeArr);//pv may not be set properly here...
quickSort(arr,0,pv);//if pv is not set properly, unexpected
                    //results can occur here.