3-х сторонняя быстрая сортировка, вопрос - PullRequest
4 голосов
/ 10 июня 2010

Я пытаюсь понять трехстороннюю радикальную сортировку, и я не понимаю, почему там переменная CUTOFF?а метод вставки?

public class Quick3string {

    private static final int CUTOFF =  15;   // cutoff to insertion sort

    // sort the array a[] of strings
    public static void sort(String[] a) {
        // StdRandom.shuffle(a);
        sort(a, 0, a.length-1, 0);
        assert isSorted(a);
    }

    // return the dth character of s, -1 if d = length of s
    private static int charAt(String s, int d) { 
        assert d >= 0 && d <= s.length();
        if (d == s.length()) return -1;
        return s.charAt(d);
    }


    // 3-way string quicksort a[lo..hi] starting at dth character
    private static void sort(String[] a, int lo, int hi, int d) { 

        // cutoff to insertion sort for small subarrays
        if (hi <= lo + CUTOFF) {
            insertion(a, lo, hi, d);
            return;
        }

        int lt = lo, gt = hi;
        int v = charAt(a[lo], d);
        int i = lo + 1;
        while (i <= gt) {
            int t = charAt(a[i], d);
            if      (t < v) exch(a, lt++, i++);
            else if (t > v) exch(a, i, gt--);
            else              i++;
        }

        // a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]. 
        sort(a, lo, lt-1, d);
        if (v >= 0) sort(a, lt, gt, d+1);
        sort(a, gt+1, hi, d);
    }

    // sort from a[lo] to a[hi], starting at the dth character
    private static void insertion(String[] a, int lo, int hi, int d) {
        for (int i = lo; i <= hi; i++)
            for (int j = i; j > lo && less(a[j], a[j-1], d); j--)
                exch(a, j, j-1);
    }

    // exchange a[i] and a[j]
    private static void exch(String[] a, int i, int j) {
        String temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

    // is v less than w, starting at character d
    private static boolean less(String v, String w, int d) {
        assert v.substring(0, d).equals(w.substring(0, d));
        return v.substring(d).compareTo(w.substring(d)) < 0; 
    }


    // is the array sorted
    private static boolean isSorted(String[] a) {
        for (int i = 1; i < a.length; i++)
            if (a[i].compareTo(a[i-1]) < 0) return false;
        return true;
    }


    public static void main(String[] args) {

        // read in the strings from standard input
        String[] a = StdIn.readAll().split("\\s+");
        int N = a.length;

        // sort the strings
        sort(a);

        // print the results
        for (int i = 0; i < N; i++)
            StdOut.println(a[i]);
    }
}

от http://www.cs.princeton.edu/algs4/51radix/Quick3string.java.html

Ответы [ 4 ]

8 голосов
/ 10 июня 2010

По-видимому, он используется для вызова сортировки вставкой для достаточно маленьких (размер <= 15) массивов. Это, скорее всего, ускорит сортировку. </p>

1 голос
/ 18 октября 2013

Эта идея исходит от Роберта Седжвика, который знает о быстрой сортировке больше, чем кто-либо из живущих.Это цитируется в Donald E. Knuth, Искусство компьютерного программирования, Том III, где он показывает, что для маленьких M, сортировка вставки быстрее, чем Quicksort, поэтому он рекомендует не сортироватьнебольшие разделы <<em> M на всех и оставление одного окончательного вставления сортировки по всему набору данных в конце.Кнут дает функцию для вычисления M (который является вашим CUTOFF), и который равен 9 для его MIX псевдокомпьютера.

1 голос
/ 18 октября 2013

Метод сортировки, приведенный выше, является рекурсивным методом. И у каждого рекурсивного метода должен быть какой-то базовый случай (иначе он будет продолжать вызывать себя, что в конечном итоге приведет к переполнению стека).

Часть вставки является базовым случаем в этом методе, потому что на каждом рекурсивном шаге разность hi-lo продолжает уменьшаться, и когда она меньше CUTOFF, сортировка вставки будет в конечном счете инициирована, заставляя рекурсию остановиться. 1003 *

if (hi <= lo + CUTOFF) {       // base case
    insertion(a, lo, hi, d);
    return;
}

Теперь, почему вставка? Потому что это хорошо работает для небольших массивов. Подробнее о сортировке здесь: http://www.sorting -algorithms.com /

1 голос
/ 10 июня 2010

Это простая оптимизация алгоритма быстрой сортировки. Стоимость рекурсивных вызовов в быстрой сортировке довольно высока, поэтому для небольших массивов сортировка с вставкой работает лучше. Итак, идея заключается в том, что если длина подмассива должна быть отсортирована ниже определенного порога, лучше отсортировать ее с помощью сортировки вставкой, чем быстрой сортировки. В вашем примере переменная CUTOFF определяет этот порог, т. Е. Если осталось менее 15 элементов, они сортируются с использованием сортировки по вставке вместо быстрой сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...