交换功能与快速排序代码工作不正常

时间:2016-07-14 22:04:29

标签: c sorting

我在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;
}

1 个答案:

答案 0 :(得分:1)

来自programmers.stackexchange.com/a/182043

  

当使用xorswap时,存在提供相同变量作为函数的两个参数的危险,该函数将所述变量归零,因为它本身是xor&d; dd将所有位变为零。当然,无论使用何种算法,这本身都会导致不必要的行为,但这种行为可能会令人惊讶,而且乍看之下并不明显。

所以你的修复是检查两个参数是否相等。