1. 程式人生 > >qsort()函式無法對含有-2147483648元素的整型陣列進行排序

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後,一切就恢復正常了。