为什么这个快速排序代码不起作用...(c)

时间:2014-04-06 22:32:52

标签: c quicksort

  #include <stdio.h>
    #include <stdlib.h>

    void quick(int *A,int left,int right,int k);
    void print(int *A);
    void swap(int *A,int x,int y);

    int indexPivot,n,tmp;


    int main()
    {
       int i,A[50],k;

       printf("\n\n\n   Size??\t\t");
       scanf("%d",&n);



       for(i=0;i<n;i++){
            printf("  %d. eleMent...\t",i+1);
            scanf("%d",&A[i]);
    }

       printf("\n   1 or 2   ");//another method but 1 is important now,not 2
       scanf("%d",&k);

       printf("\n   First appearance  ");


    print(A);

    quick(A,0,n-1,k);
       printf("   \nMedium element: %d\n   ",A[(n)/2]);

    print(A);

    }



//always putting first to pivot

    void quick(int *A,int left,int right,int k){//k is for another method,not used here
        int pivot,i,j;
    if(k==1){
        indexPivot=left;
        pivot=A[indexPivot];
        }
        /*else{
            if(A[left]<A[right]){
                if(A[(right+left)/2]>A[right]){

                    indexPivot=right;
                }
                else{

                    indexPivot=(right+left)/2;
                }
            }
            else{
                    if(A[(right+left)/2]>A[left]){

                    indexPivot=left;
                }
                else{
               indexPivot=(right+left)/2;
                }
            }
           }
           printf("\n   Pivot: %d",A[indexPivot]);*/

    while(indexPivot!=(right+left)/2&&left<right){
     j=right;
    i=left+1;print(A);
       while(i<j){
            while(pivot<A[j]&&left<j){
                j=j-1;
               print(A);
            }
            while(pivot>A[i]&&i<j){
                    i=i+1;
                   print(A);
            }

    if(i<j){
            swap(A,i,j);
       print(A);
       i=i+1;
       j=j-1;
       print(A);
    }

       print(A);
       }
    //while(A[s]>pivot){i=i-1;}

       swap(A,indexPivot,j);
       indexPivot=j;//pivot goes its place


    print(A);

        if(indexPivot>(right+left)/2){
            quick(A,left,indexPivot-1,k);
            print(A);

         }
         if(indexPivot<(right+left)/2){
            quick(A,indexPivot+1,right,k);
            print(A);

         }

     }

     }





    void print(int *A){
       int i;
       printf("\n   ");
        for(i=0;i<n;i++){
            printf("%d ",A[i]);
            }
    }





    void swap(int *A,int x,int y){
    int tmp;
    tmp=A[x];
    A[x]=A[y];
    A[y]=tmp;
    }

我正在为此工作5个小时,但仍然无法做到。它进入了不定式循环。

我给{1,2,3,4,5,但它会进入无限循环。

我调试,分析但看不到它。

等待别人的建议。

这不是所有的快速排序。我正在尝试不同的东西。唯一的区别是

  if(indexPivot>(right+left)/2){
    quick(A,left,indexPivot-1,k);
    print(A);

 }
 if(indexPivot<(right+left)/2){
    quick(A,indexPivot+1,right,k);
    print(A);

 }

那部分。

1 个答案:

答案 0 :(得分:0)

问题似乎存在于这一行:

while(pivot<A[j]&&left<j)

应该是:

while(pivot<A[j]&&i<j)