2014-05-18 97 views
0
#include<stdio.h> 

void swap(int *a, int *b){ 
     int temp = *a; 
     *a=*b; 
     *b=temp; 
} 

int partition(int arr[], int l, int r){ 
     int pivot = arr[l]; 
     int left,right; 
     for(left=l+1,right=r;left<right;){ 
      if(arr[left]>pivot && arr[right]<=pivot){ 
        swap(&arr[left],&arr[right]); 
      } 
      if(arr[left]<=pivot) 
        left++; 
      if(arr[right]>pivot) 
        right--; 
    } 
      swap(&arr[l],&arr[right]); 
      return right; 
} 

    void quicksort(int arr[], int l, int r){ 
      int p; 
     if (l < r){ 
       p = partition(arr,l,r); 
       quicksort(arr,l,p-1); 
       quicksort(arr,p+1,r); 
     } 
} 

    int main(){ 
      int i,size; 
    //  int arr[] = { 10, 20, 7 , 5, 24 , 17, 13, 56, 38, 12 , 29, 46}; 
    //  int arr[] = {0,2,2}; 
      int arr[] = {2,2,1,0}; 
      size = sizeof(arr)/sizeof(arr[0]); 
      printf("The array before sorting is --->"); 
      for(i=0;i<size;i++){ 
        printf("--->%d",arr[i]); 
      } 
      printf("--->END\n\n"); 
      quicksort(arr,0,size-1); 
      printf("The array after sorting is --->"); 
      for(i=0;i<size;i++){ 
        printf("--->%d",arr[i]); 
      } 
      printf("--->END"); 
    } 

上面的quciksort代碼適用於未排序數組,但不適用於排序數組。我試圖改變分區功能,但無濟於事。如果數組已排序,但未排序的數組已被破壞,則分區中的交換已被刪除。有人可以幫助解決這個問題嗎?快速排序代碼不適用於排序陣列

+1

「不起作用」不適用於我。 –

回答

2

partition,for循環改變到

for(left=l+1,right=r;left<=right;) 

你錯過了=星座,所以少了一個對比正在發生。

Code

+0

我注意到代碼正在排序除數組的第一個元素之外的所有元素,這表明這可能是問題所在。 – pwaring

+0

謝謝@Rikayan Bandyopadhyay – Dcoder