快速排序代码不适用于排序数组

时间:2014-05-18 15:04:15

标签: c arrays sorting quicksort

#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 个答案:

答案 0 :(得分:2)

partition中,将for循环更改为

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

您错过了=符号,因此正在进行少量比较。

Code