Quickselect осуществления со средним из трех разделов и отсечки \u0026quot;для малого

В компьютерной науке, quickselect алгоритм выбора NTH наименьший элемент массива, основанного на алгоритме быстрой сортировки.

Быстрая сортировка с Медиана-оф-три функции перегородки почти такой же, как нормальный быстрой сортировки с той лишь разницей, каким опорного пункта выбран. В нормальной быстрой сортировки первого элемента будет автоматически пункта стержень. Это приводит к быстрой сортировки нормальное функционирование очень неэффективно при предъявлении уже отсортированный список. Отдел будет всегда в конечном итоге, производящая одно суб-массива без каких-либо элементов и один со всеми элементами (минус, конечно же, пункт Pivot). В быстрой сортировки с срединно-троих перегородки пункта стержнем выбирается как среднее между первым элементом, последний элемент, а средний элемент (решили помощью целочисленного деления п / 2). В тех случаях, уже отсортированных списков этой связи должна быть среднего элемента в качестве опорного сокращая тем самым inefficency найти в нормальном QuickSort.

Следующий код показывает, как реализовать быстро выбрать алгоритм в Java:


    /**

     * Quick selection algorithm.

     * Places the kth smallest item in a[k-1].

     @param a an array of Comparable items.

     @param k the desired rank (1 is minimum) in the entire array.

     */

    public static void quickSelectComparable [ ] a, int ) {

        quickSelecta, 0, a.length - 1, k );

    }

    

    /**

     * Internal selection method that makes recursive calls.

     * Uses median-of-three partitioning and a cutoff of 10.

     * Places the kth smallest item in a[k-1].

     @param a an array of Comparable items.

     @param low the left-most index of the subarray.

     @param high the right-most index of the subarray.

     @param k the desired rank (1 is minimum) in the entire array.

     */

    private static void quickSelectComparable [ ] a, int low, int high, int ) {

        iflow + CUTOFF > high )

            insertionSorta, low, high );

        else {

            // Sort low, middle, high

            int middle = low + high 2;

            ifamiddle ].compareToalow ] ) )

                swapReferencesa, low, middle );

            ifahigh ].compareToalow ] ) )

                swapReferencesa, low, high );

            ifahigh ].compareToamiddle ] ) )

                swapReferencesa, middle, high );

            

            // Place pivot at position high - 1

            swapReferencesa, middle, high - );

            Comparable pivot = ahigh - ];

            

            // Begin partitioning

            int i, j;

            fori = low, j = high - 1; ; ) {

                whilea++i ].compareTopivot )

                    ;

                whilepivot.compareToa--j ] ) )

                    ;

                ifi >= j )

                    break;

                swapReferencesa, i, j );

            }

            

            // Restore pivot

            swapReferencesa, i, high - );

            

            // Recurse; only this part changes

            ifk <= i )

                quickSelecta, low, i - 1, k );

            else ifk > i + )

                quickSelecta, i + 1, high, k );

        }

    }

    

    

    /**

     * Internal insertion sort routine for subarrays

     * that is used by quicksort.

     @param a an array of Comparable items.

     @param low the left-most index of the subarray.

     @param n the number of items to sort.

     */

    private static void insertionSortComparable [ ] a, int low, int high ) {

        forint p = low + 1; p <= high; p++ ) {

            Comparable tmp = a];

            int j;

            

            forj = p; j > low && tmp.compareToaj - ] ) 0; j-- )

                a= aj - ];

            a= tmp;

        }

    }

    

    

    private static final int CUTOFF = 10;

    

    /**

     * Method to swap to elements in an array.

     @param a an array of objects.

     @param index1 the index of the first object.

     @param index2 the index of the second object.

     */

    public static final void swapReferencesObject [ ] a, int index1, int index2 ) {

        Object tmp = aindex1 ];

        aindex1 = aindex2 ];

        aindex2 = tmp;

    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>