C qsort不能在长时间内正常工作
我对二维数组a[n][2]进行排序,关于a[I][0],a[I+1][0]与非递减的a[I][1],a[I+1][1]断开联系。 qsort可以很好地处理整数数组,但不能处理长数组 整数数组代码C qsort不能在长时间内正常工作,c,qsort,long-long,C,Qsort,Long Long,我对二维数组a[n][2]进行排序,关于a[I][0],a[I+1][0]与非递减的a[I][1],a[I+1][1]断开联系。 qsort可以很好地处理整数数组,但不能处理长数组 整数数组代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <limits.h> int cmpfunc(const void*
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void* a, const void* b)
{
int x = ((int*)a)[0] - ((int*)b)[0];
if (x != 0) {
return x;
}
return ((int*)a)[1] - ((int*)b)[1];
}
int main(int argc, char const* argv[])
{
int n, i, j;
scanf("%d", &n);
int a[n][2];
for (i = 0; i < n; i = i + 1) {
scanf("%d %d", &a[i][0], &a[i][1]);
}
qsort(a, n, sizeof(a[0]), cmpfunc);
for (i = 0; i < n; i = i + 1) {
printf("%d %d\n", a[i][0], a[i][1]);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void* a, const void* b)
{
int x = ((int*)a)[0] - ((int*)b)[0];
if (x != 0) {
return x;
}
return ((int*)a)[1] - ((int*)b)[1];
}
int main(int argc, char const* argv[])
{
int n, i, j;
scanf("%d", &n);
long long a[n][2];
for (i = 0; i < n; i = i + 1) {
scanf("%I64d %I64d", &a[i][0], &a[i][1]);
}
qsort(a, n, sizeof(a[0]), cmpfunc);
for (i = 0; i < n; i = i + 1) {
printf("%I64d %I64d\n", a[i][0], a[i][1]);
}
return 0;
}
第一个代码的输出:
4 1
4 1
4 1
4 2
4 3
第二个代码的输出:
4 2
4 1
4 1
4 1
4 3
即使将数据类型更改为
long-long
,您仍然可以在比较函数中强制转换为int*
,即使在编译时启用了警告,您仍然可以在比较函数中强制转换为int*
,即使将数据类型更改为long
(-Wall-pedantic
用于gcc)您应该注意到,long-long-int
需要不同的占位符,并且不能假定它是64位的
。您还错误地转换了compare函数的参数。
请注意,两个long-long-int
之间的差异可能超出int
的范围,因此您不能使用(我编写的那一个)qsort()
比较实现。下面是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void *a,const void *b){
long long int x=((long long int *)a)[0]-((long long int *)b)[0];
if(x!=0){
return x;
}
return ((long long int *)a)[1]-((long long int *)b)[1];
}
int main(int argc, char const *argv[]){
int n,i;
scanf("%d",&n);
long long a[n][2];
for(i=0;i<n;i=i+1){
scanf("%lld %lld",&a[i][0],&a[i][1]);
}
qsort(a,n,sizeof(a[0]),cmpfunc);
for(i=0;i<n;i=i+1){
printf("%lld %lld\n",a[i][0],a[i][1]);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
int cmpfunc(常数无效*a,常数无效*b){
长整型x=((长整型*)a)[0]-((长整型*)b)[0];
如果(x!=0){
返回x;
}
返回((长整型*)a)[1]-((长整型*)b)[1];
}
int main(int argc,char const*argv[]{
int n,i;
scanf(“%d”和“&n”);
长a[n][2];
对于(i=0;i如果您在编译(-Wall-pedantic
for gcc)时启用警告,您应该注意,long-long int
需要不同的占位符,并且不能假定它是64位的
。您还错误地转换了compare函数的参数。
请注意,两个long-long-int
之间的差异可能超出int
的范围,因此您不能使用(我编写的那一个)qsort()
比较实现。下面是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
int cmpfunc(const void *a,const void *b){
long long int x=((long long int *)a)[0]-((long long int *)b)[0];
if(x!=0){
return x;
}
return ((long long int *)a)[1]-((long long int *)b)[1];
}
int main(int argc, char const *argv[]){
int n,i;
scanf("%d",&n);
long long a[n][2];
for(i=0;i<n;i=i+1){
scanf("%lld %lld",&a[i][0],&a[i][1]);
}
qsort(a,n,sizeof(a[0]),cmpfunc);
for(i=0;i<n;i=i+1){
printf("%lld %lld\n",a[i][0],a[i][1]);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
int cmpfunc(常数无效*a,常数无效*b){
长整型x=((长整型*)a)[0]-((长整型*)b)[0];
如果(x!=0){
返回x;
}
返回((长整型*)a)[1]-((长整型*)b)[1];
}
int main(int argc,char const*argv[]{
int n,i;
scanf(“%d”和“&n”);
长a[n][2];
对于(i=0;i你实际上有两个问题:第一个是无效施法的问题。第二个也是关于无效施法的问题,但还有另一个原因
如我的一条评论所述,qsort
函数将指向元素的指针传递给比较函数。如果您有数组arr
,则qsort
将使用类似&arr[0]的内容
用于参数。这意味着如果数组的数据本身是数组,那么参数将是指向数组的指针。在您的特定情况下,参数类型实际上是long(*)[2]
,而不仅仅是long*
因此,比较函数应该如下所示:
int cmpfunc(const void* a_, const void* b_)
{
long long (*a)[2] = (long long (*)[2]) a_;
long long (*b)[2] = (long long (*)[2]) b_;
long long result;
if ((*a)[0] - (*b)[0] != 0)
result = (*a)[0] - (*b)[0];
else
result = (*a)[1] - (*b)[1];
if (result < 0)
return -1;
else if (result > 0)
return 1;
else
return 0;
}
int-cmpfunc(常量无效*a\u,常量无效*b\u)
{
长长(*a)[2]=(长长(*)[2])a;
长长(*b)[2]=(长长(*)[2])b;
长期结果;
如果((*a)[0]-(*b)[0]!=0)
结果=(*a)[0]-(*b)[0];
其他的
结果=(*a)[1]-(*b)[1];
如果(结果<0)
返回-1;
否则,如果(结果>0)
返回1;
其他的
返回0;
}
您实际上有两个问题:第一个问题是无效的施法。第二个问题也是关于无效的施法,但还有另一个原因
如我的一条评论所述,qsort
函数将指向元素的指针传递给比较函数。如果您有数组arr
,则qsort
将使用类似&arr[0]的内容
用于参数。这意味着如果数组的数据本身是数组,那么参数将是指向数组的指针。在您的特定情况下,参数类型实际上是long(*)[2]
,而不仅仅是long*
因此,比较函数应该如下所示:
int cmpfunc(const void* a_, const void* b_)
{
long long (*a)[2] = (long long (*)[2]) a_;
long long (*b)[2] = (long long (*)[2]) b_;
long long result;
if ((*a)[0] - (*b)[0] != 0)
result = (*a)[0] - (*b)[0];
else
result = (*a)[1] - (*b)[1];
if (result < 0)
return -1;
else if (result > 0)
return 1;
else
return 0;
}
int-cmpfunc(常量无效*a\u,常量无效*b\u)
{
长长(*a)[2]=(长长(*)[2])a;
长长(*b)[2]=(长长(*)[2])b;
长期结果;
如果((*a)[0]-(*b)[0]!=0)
结果=(*a)[0]-(*b)[0];
其他的
结果=(*a)[1]-(*b)[1];
如果(结果<0)
返回-1;
否则,如果(结果>0)
返回1;
其他的
返回0;
}
在使用long-long
的情况下,您没有忘记什么吗?尤其是在比较函数中?a
和b
的实际类型是什么?我建议您学习如何调试代码。从添加printf()开始
语句以查看变量的值。@某个编程人员知道这有什么关系?输入仍然在int范围内,它应该可以与int*cast一起工作,对吗?您的代码没有意义。您不理解如何qsort()
工作。还有一个问题是qsort
将指向元素的指针传递给比较函数,即它传递&a[0]
(使用主函数中的a
数组),该数组的类型为long(*)[2]
。如果您使用long-long
,您没有忘记什么吗?尤其是在比较函数中?a
和b
的实际类型是什么?我建议您学习如何调试代码。从添加printf()开始
语句以查看变量的值。@某个编程人员知道这有什么关系?输入仍然在int范围内,它应该可以与int*cast一起工作,对吗?您的代码没有意义。您不理解如何qsort()
有效。还有一个问题是qsort
将指向元素的指针传递给比较函数,即它传递&a[0]
(u