【发布时间】:2011-11-03 06:56:04
【问题描述】:
这里的新手程序员试图实现快速排序,但它不起作用。我查看了在线资源,但似乎无法在我的实现中发现错误。提前致谢。
EDIT 我遇到的问题似乎卡在快速排序功能中,程序就挂起。当我尝试使用 printf 对其进行调试时,原始数组似乎已被修改为意外数字(不是来自原始列表),例如 0。
void quicksort(int a[], const int start, const int end)
{
if( (end - start + 1 ) < 2)
return;
int pivot = a[rand()%(end - start)];
//Two pointers
int L = start;
int R = end;
while(L < R)
{
while(a[L] < pivot)
L++;
while(a[R] > pivot)
R--;
if(L < R)
swap(a,L,R);
}
quicksort(a, start, L-1);
quicksort(a, L+1, end );
}
void swap(int a[], const int pos1, const int pos2)
{
a[pos1] ^= a[pos2];
a[pos2] ^= a[pos1];
a[pos1] ^= a[pos2];
}
int main()
{
int array[20] = {0};
int size = sizeof(array)/sizeof(array[0]);//index range = size - 1
int i = 0;
printf("Original: ");
for (i; i < size; i++)
{
array[i] = rand()%100+ 1;
printf("%d ", array[i]);
}
printf("\n");
quicksort(array,0,size-1);
int j = 0;
printf("Sorted: ");
for(j; j < size; j++)
printf("%d ", array[j]);
printf("\n");
}
附加问题:关于递归调用快速排序,左右指针是否总是指向每个分区末尾的枢轴?如果是这样,从开始到 L-1 和 L+1 到结束调用快速排序是否正确?
另外,交换之前的 if (L
【问题讨论】:
-
什么症状?当前结果与预期?请不要只要求我们修复您的大块代码。
-
糟糕。它卡在某个地方;它不会退出快速排序。当它以某种方式成功退出时,它引入了原始列表中没有的数字。
-
进行真正的交换,不要那样做 xor mumbo jumbo。
-
请注意,如果您尝试将对象与自身交换,则 xor 技巧会失败(在这种情况下不是问题)。
标签: c algorithm sorting quicksort