2014-05-18 70 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