C 当使用两个不同的编译器时,我得到了不同的输出
我有一个让我困惑的代码。所以,我制作了一个源代码,它将进行一些分区(就像快速排序一样),并在pivot的左右两侧进行排序。但是,我的问题是,当我把它提交给在线评委时,它给了我错误的答案(但在我的代码中,我已经尝试过了,它给出了确切的输出结果)。这是我的源代码: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
#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.