您好,我正在我的一个程序中使用排序算法。这是快速排序。我用排序数组测试了它,如下所示
int arr[7] = {1,2,3,4,5,6,7};
排序算法代码是
void sort(int arr[],int left,int right)
{
int i= left, j= right;
int pivot = arr[((left+right)/2)];
int tmp=0;
/* partition */
printf("%d\n",arr[0]);
while(i<=j)
{
while(arr[i]<pivot)
i++;
while(arr[j]>pivot)
j--;
if(i<=j)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
/* recursion */
if(left<j)
sort(arr,left,j);
if(i<right)
sort(arr,i,right);
}
当它返回结果时,它将arr [0]值赋值为0.应为1。
我在main中调用了这个函数。以下是调用sort
的代码int main()
{
int i;
int arr[7] = {1,2,3,4,5,6,7};int max=0,min=0;
int len = (sizeof(arr)/sizeof(arr[0]));
printf("%d\n",arr[0]);
sort(arr,0,len);
printf("%d\n",arr[0]);
return 0;
}
答案 0 :(得分:2)
这是你的问题:
sort(arr,0,len);
您将大小作为最右侧的数组元素传递。这会导致您读取和写出数组的末尾,从而产生undefined behavior。
您需要传入最右边元素的索引,该索引少1:
sort(arr,0,len-1);
答案 1 :(得分:1)
算法本身看起来不错,但我认为在<= pivot
循环中使用>= pivot
和while
会更好。
我能想到的唯一问题是你使用参数sort
调用0
函数和数组中的元素数量。但请注意,right
这里表示正确位置的索引,而不是后面的索引。所以它应该是7
或sizeof(arr)/sizeof(arr[0])-1)