簡體   English   中英

Java在找出Quicksort中位數3時遇到麻煩

[英]Java having trouble figuring out Quicksort Median of 3

我很難進行3的Quicksort中值(截止)。 在此之后,我必須找出5的中位數,但是我需要弄清楚我在做什么錯,因為我得到的答案是未分類的。

    public class QuicksortTest1 
    {   
        public static <AnyType extends Comparable<? super AnyType>> void    
        quicksort(AnyType [] a)
        {
            quicksort(a, 0, a.length - 1);
        }   

        private static <AnyType extends Comparable<? super AnyType>> void   
        quicksort(AnyType [] a, int left, int right)
        {
            final int CUTOFF = 3;

            if (left + CUTOFF <= right) 
            { 
                AnyType pivot = (AnyType) median3 (a, left, right);

                int i = left, j = right - 1;
                for( ; ;)
            {
                while( a[++i].compareTo(pivot) < 0) {}
                while( a[--j].compareTo(pivot) < 0) {}
                if(i < j)
                    swap(a, i, j);
                else
                    break;
        }
            swap(a, i, right - 1);

            quicksort(a, left, i - 1);
            quicksort(a, i + 1, right);
        } 
        else
            insertionSort(a, left, right);
    } 

    private static <AnyType extends Comparable<? super AnyType>> AnyType 
    median3(AnyType [] a, int left, int right)
    {
        int center = (left + right) /2;

        if (a[center].compareTo(a[left]) < 0)
            swap(a,left,center);

        if (a[right].compareTo(a[left]) < 0)
            swap(a, left, right);

        if (a[right].compareTo(a[center]) < 0)
            swap(a, center, right);

        swap(a, center, right - 1);
        return a[right - 1]; 
    }

    private static void swap(Comparable a[], int i, int j)
    {
        Comparable tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }

    private static void insertionSort(Comparable a[], int left, int right)
    {
        int j;

        for (int p = left + 1; p <= right; p++)
        {
            Comparable tmp = a[p];
            for (j = p; j > left && tmp.compareTo( a[j - 1]) < 0; j--)
                a[j] = a[j-1];
                a[j] = tmp;
    }
  } 

    public static void main (String [] args)
    {
        Comparable [] a = {1,53,86,21,49,32,90,65,33,11,
                      34,68,54,32,78,80,35,22,96,59,265,44324,123,3123,25435};
        quicksort(a);
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");        
    } 

}

//結果:1 49 265 32 44324 21 53 123 11 3123 25435 33 34 32 59 96 22 86 90 35 65 68 54 78 80

注釋中注釋的代碼更改

    private static <AnyType extends Comparable<? super AnyType>> void   
    quicksort(AnyType [] a, int left, int right)
    {
        final int CUTOFF = 3;
        if (left + CUTOFF <= right) 
        { 
            AnyType pivot = (AnyType) median3 (a, left, right);
            int i = left - 1, j = right + 1;    // fix
            for( ; ;)
            {
                while( a[++i].compareTo(pivot) < 0) {}
                while( a[--j].compareTo(pivot) > 0) {} // fix
                if(i < j)
                    swap(a, i, j);
                else
                    break;
            }
        //  swap(a, i, right - 1);              // delete
            quicksort(a, left, j);              // fix
            quicksort(a, j + 1, right);         // fix
        } 
          else
            insertionSort(a, left, right);
    } 

    private static <AnyType extends Comparable<? super AnyType>> AnyType 
    median3(AnyType [] a, int left, int right)
    {
        int center = (left + right) /2;
        if (a[center].compareTo(a[left]) < 0)
            swap(a,left,center);
        if (a[right].compareTo(a[left]) < 0)
            swap(a, left, right);
        if (a[right].compareTo(a[center]) < 0)
            swap(a, center, right);
    //  swap(a, center, right - 1);             // delete
        return a[center];                       // fix
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM