qsort()函数无法对含有-2147483648元素的整型数组进行排序

        最近做题刷到lLeetCode的350题:求两个数组的交集II。我先用qsort()函数对两个数组进行升序排序,然后再对两个数组进行比较,求出交集,代码如下:

int cmp(void const *a,void const *b)
{
    return *(int *)a -*(int *)b;
}

int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) 
{
     if(nums1Size==0||nums2Size==0)
        return NULL;
    qsort(nums1,nums1Size,sizeof(nums1[0]),cmp);
    qsort(nums2,nums2Size,sizeof(nums2[0]),cmp);
    
    int i = 0 , j = 0 ;	
    int *newnum = (int *)malloc((nums1Size+nums2Size)*sizeof(int));
    *returnSize = 0;

    while(i < nums1Size && j < nums2Size)
	{
		if(nums1[i] > nums2[j])
			j++;
		else if(nums1[i] < nums2[j])
			i++;
		else 
		{
			newnum[(*returnSize)++] = nums1[i];
			i++;j++;
		}
	}
    return newnum;
}

         提交解答,出现下面结果:

         看到这种情况,我的第一反应是这个测试用例有问题:-2147483648是不是超过整型范围了。查了一下,刚刚没超过范围,是整型的最小值(16位机 整型最小值-32678)。测试用例没问题,那只能是我程序的逻辑问题了,试着把测试用例代入程序中,逐条代码在纸上演算,没啥逻辑错误。其实这题也没啥逻辑的,可就是提交不成功,编程有时就是这样莫名其妙,无理取闹。排除了其它可能, 我不得不开始怀疑函数库自带的qsort()函数了,编了一段小程序看看它到底给我排成什么样了。

int main()
{	
	int a[4] = {-2147483648,1,2,3},i;
	int b[3] = {1,-2147483648,-2147483648};

	qsort(a,4,sizeof(int),cmp); 
	for(i=0;i<4;i++) 
		printf("%d ",a[i]);
	printf("\n");

	qsort(b,3,sizeof(int),cmp);  
	for(i=0;i<3;i++)
		printf("%d ",b[i]);
	getchar();
	return 0;
}

        运行结果:

         看到运行结果我很高兴,终于找到病根了,用冒泡排序代替qsort()快速排序后,顺利提交成功了。至于为什么qsort()无法对-2147483648进行排序,这我就不得而知了。但我想,肯定是由于这个数太小了,将这个数改为-2147483647后,结果仍然一样。但改为-2147483646后,一切就恢复正常了。

 

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页