我在C中测试我的快速排序代码(计算此功能在排序时必须进行的交换次数),这不能提供正确的结果。
我把它缩小到我的交换函数。当交换函数得到first = 3和second = 3.Its最终结果变为first = 0和second = 0。
当分别测试时,此功能正常工作。下面是代码
#include<stdio.h>
#define SIZE 5
int arr[SIZE];
void quicksort(int start, int end);
long int answer = 0;
int main(){
int i, input;
for(i = 0; i < SIZE; i++){
scanf("%d",&arr[i]);
}
quicksort(0, SIZE - 1);
printf("%ld\n", answer);
return 0;
}
void quicksort(int start, int end){
void swap(int * first, int * second);
int partition(int start, int end);
int pos;
if(start >= end)return;
else{
pos = partition(start, end);
quicksort(start, pos - 1);
quicksort(pos + 1, end);
answer += (end - start);
}
}
void swap(int * first, int * second){
printf("start = %d , end = %d\n",*first, *second);
*first = *first ^ *second;
*second = *first ^ *second;
*first = *first ^ *second;
printf("start = %d , end = %d\n",*first, *second);
}
int findpivot(int start, int end){
return start;
}
int partition(int start, int end){
int findpivot(int start, int end);
int i = 0;
int pivot_pos = findpivot(start, end);
int pivot = arr[pivot_pos];
int pos = pivot_pos + 1;
for(i = pivot_pos + 1 ; i <= end; i++){
if(arr[i] <= pivot){
swap(&arr[i], &arr[pos]);
pos++;
}
}
pos--;
for(i = 0; i < SIZE; i++){
printf("%d ",arr[i]);
}
printf("\n");
swap(&arr[pivot_pos], &arr[pos]);
for(i = 0; i < SIZE; i++){
printf("%d ",arr[i]);
}
printf("getting out\n");
return pos;
}
答案 0 :(得分:1)
来自programmers.stackexchange.com/a/182043
当使用xorswap时,存在提供相同变量作为函数的两个参数的危险,该函数将所述变量归零,因为它本身是xor&d; dd将所有位变为零。当然,无论使用何种算法,这本身都会导致不必要的行为,但这种行为可能会令人惊讶,而且乍看之下并不明显。
所以你的修复是检查两个参数是否相等。