2016-07-14 64 views
0

我正在測試C中的快速排序代碼(它計算此函數在排序時必須進行的交換次數),該代碼不能提供正確的結果。
我縮小到我的交換功能。當交換功能得到第一個= 3和第二個= 3.它的最終結果變成第一個= 0和第二個= 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

爲什麼使用XOR(^)作爲交換功能?爲什麼不像'int temp = * first; * first = * second; * second = temp;' –

+0

您還在其他函數中聲明瞭函數原型,這些函數原型需要在全局範圍內定義。 –

+1

我知道第二個選擇,但我想知道爲什麼這不起作用。至於函數原型,我已經使用了由Ritchie編寫的C編程書籍的風格。 –

回答

1

programmers.stackexchange.com/a/182043

當使用xorswap有作爲兩個參數,其將清零上述變量,由於它是與自身進行XOR運算,函數提供相同的變量的危險,其把一切位零。當然,無論使用哪種算法,這本身都會導致不希望的行爲,但行爲可能會令人驚訝,並且乍一看並不明顯。

所以你的修復是檢查兩個參數是否相等。