Arrays qsort-won';t对整数数组进行排序

Arrays qsort-won';t对整数数组进行排序,arrays,c,qsort,Arrays,C,Qsort,这是我的代码: #include <stdio.h> #include <stdlib.h> #include <time.h> int comp (const void *a, const void *b) { int *s1 = (int *)a; int *s2 = (int *)b; return (s1 - s2); } int main() { int a[] = { 1, 2, 5, 3 }; qso

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int comp (const void *a, const void *b)
{
    int *s1 = (int *)a;
    int *s2 = (int *)b;

    return (s1 - s2);
}

int main() {
    int a[] = { 1, 2, 5, 3 };
    qsort(a, 4, sizeof(a), comp);
    for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
        printf("%d ", a[i]);
    }
}
#包括
#包括
#包括
内部组件(常数无效*a,常数无效*b)
{
int*s1=(int*)a;
int*s2=(int*)b;
返回(s1-s2);
}
int main(){
inta[]={1,2,5,3};
qsort(a,4,sizeof(a),comp);
对于(int i=0;i
我正在使用
qsort()
对数组进行升序排序,但不幸的是,什么也没有发生。数组元素保持在相同的位置。每当调用
comp()
函数时,我都尝试打印消息,并且调用正确。问题是,元素没有改变


可能是什么问题?

您正在减去指针,而不是整数。使用指针获取实际值

这可能意味着按照您所说的执行
return(*s1-*s2)
。然而,正如Eugene Sh.提到的,这可能会溢出
int
。因此,比较
*s1
*s2
并相应地返回
1
-1
0
。Weather Vane还提到您传递了错误的大小值。您应该将元素的数量和每个元素的大小分别传递给第2个和第3个参数。 所以
qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),comp

#包括
#包括
#包括
内部组件(常数无效*a,常数无效*b)
{
int*s1=(int*)a;
int*s2=(int*)b;
如果(*s1>*s2){
返回1;
}
否则如果(*s1==*s2){
返回0;
}
否则{
返回-1;
}
}
int main(){
inta[]={1,2,5,3};
qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),comp;

对于(inti=0;i您正在减去指针,而不是整数。请根据指针来获得实际值

这可能意味着执行
return(*s1-*s2)
正如您所说。然而,正如Eugene Sh.所提到的,这可能会溢出
int
。因此,相反,比较
*s1
*s2
,并相应地返回
1
-1
,或者,
0
。气象风向标还提到您传递了错误的大小值。您应该传递元素的数量和e的大小每个元素分别对应于第二个和第三个参数。 所以
qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),comp);

#包括
#包括
#包括
内部组件(常数无效*a,常数无效*b)
{
int*s1=(int*)a;
int*s2=(int*)b;
如果(*s1>*s2){
返回1;
}
否则如果(*s1==*s2){
返回0;
}
否则{
返回-1;
}
}
int main(){
inta[]={1,2,5,3};
qsort(a,sizeof(a)/sizeof(a[0]),sizeof(a[0]),comp;

对于(int i=0;i您正在减去指针,而不是整数。请尊重指针以获得实际值。它将很好地按内存中的位置对它们进行排序:)哦,好吧,它们已经按此排序了…@christophemore您的意思是
return(*s1-*s2)
?顺便说一下,这是一个危险的函数。它可能会溢出
int
。您最好使用比较并根据它返回
+/-1
0
qsort()
参数
sizeof(a)
也是错误的,它应该是
sizeof a[0]
(每个元素的大小)。您正在减去指针,而不是整数。请尊重指针以获得实际值。它将很好地按内存中的位置对它们进行排序:)哦,好吧,它们已经按此排序了…@Christophermore您的意思是
return(*s1-*s2)
?顺便说一句,这是一个危险的函数。它可能溢出
int
。您最好使用比较并根据它返回
+/-1
0
qsort()
参数
sizeof(a)
也是错误的,它应该是
sizeof a[0]
(每个元素的大小)。次要:代码可能会丢失一些
()
sizeof(a)/sizeof(a[0])
-->
sizeof a/sizeof a[0]
int i=0
更好,因为
size\t i=0
次要:代码可能会掉落一些
()
sizeof(a)/sizeof(a[0])

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int comp (const void * a, const void * b)
{
    int *s1 = (int *)a;
    int *s2 = (int *)b;

    if(*s1 > *s2) {
        return 1;
    }
    else if(*s1 == *s2) {
        return 0;
    }
    else {
        return -1;
    }
}

int main() {
    int a[] = {1, 2, 5, 3};
    qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), comp);
    for (int i = 0; i<sizeof(a)/sizeof(a[0]); i++) {
        printf("%d ", a[i]);
    }
}