Что такое QuickSort с 3-полосным разделом?
Quicksort с 3-полосным разделом
Ответ 1
Изображение массива:
3, 5, 2, 7, 6, 4, 2, 8, 8, 9, 0
A два раздела Quick Sort выберет значение, скажем 4, и поместит каждый элемент больше 4 с одной стороны массива и каждый элемент меньше 4 с другой стороны. Например:
3, 2, 0, 2, 4, | 8, 7, 8, 9, 6, 5
A три раздела Быстрая сортировка будет выбирать два значения для разделения и разбиения массива таким образом. Позволяет выбрать 4 и 7:
3, 2, 0, 2, | 4, 6, 5, 7, | 8, 8, 9
Это просто небольшое изменение в регулярной быстрой сортировке.
Вы продолжаете разбивать разделы на разделы до тех пор, пока массив не будет отсортирован. Время выполнения - это технически nlog 3 (n), которое так мало меняется от регулярного quicksort nlog 2 (n).
Ответ 2
http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf
См. также:
http://www.sorting-algorithms.com/quick-sort-3-way
Я подумал, что версия для интервью также интересна. Он спрашивает, существуют четыре версии версии quicksort...
Ответ 3
если вы действительно измельчите математику, используя , оставляя количество разделов в качестве параметра, а затем оптимизируя этот параметр, вы обнаружите, что разделы e (= 2,718...) дают самую быструю производительность. на практике, однако, наши языковые конструкции, cpus и т.д. оптимизированы для двоичных операций, поэтому стандартное разбиение на два набора будет самым быстрым.
Ответ 4
Я думаю, что 3-х сторонний раздел от Djstrka.
Подумайте о массиве с элементами { 3, 9, 4, 1, 2, 3, 15, 17, 25, 17 }
.
В основном вы устанавливаете 3 раздела: меньше, равно и больше, чем определенный круг. Разделение на равные не нуждается в дальнейшей сортировке, поскольку все его элементы уже равны.
Например, если мы выбираем первый 3
в качестве шарнира, а затем 3-полосная раздела А, используя Алгоритм Дейкстры бы расположить исходный массив и возвращают два индекса m1
и m2
таким образом, что все элементы, индекс меньше m1
будет ниже, чем 3
, все элементы, индекс которых больше или равен m1
и меньше или равен m2
, будут равны 3
, а все элементы, чей индекс больше m2
будет больше, чем 3
.
В этом конкретном случае результирующий массив может быть { 1, 2, 3, 3, 9, 4, 15, 17, 25, 17 }
, а значения m1
и m2
будут m1 = 2
и m2 = 3
.
Обратите внимание, что результирующий массив может меняться в зависимости от стратегии, используемой для разбиения, но числа m1
и m2
будут одинаковыми.
Ответ 5
Я думаю, что это связано с режимом Дийкстры разбиения, где раздел имеет элементы меньшего размера, равные и больше, чем точка поворота. Нужно сортировать только меньшие и большие разделы, рекурсивно. Вы можете увидеть интерактивную визуализацию и сыграть с ней в грецком орехе. Цвета, которые я использовал там, это красный/белый/синий, потому что метод разбиения обычно называется "проблемой голландского флага"
Ответ 6
3 способа быстрой сортировки в основном разбивают массив на 3 части. Первая часть меньше, чем сводная, вторая часть равна сводной, а третья больше, чем сводная. Это алгоритм линейного разделения. Этот раздел похож на проблему голландского национального флага.
Ответ 7
//code to implement Dijkstra 3-way partitioning
package Sorting;
public class QuickSortUsing3WayPartitioning {
private int[]original;
private int length;
private int lt;
private int gt;
public QuickSortUsing3WayPartitioning(int len){
length = len;
//original = new int[length];
original = {0,7,8,1,8,9,3,8,8,8,0,7,8,1,8,9,3,8,8,8};
}
public void swap(int a, int b){ //here indexes are passed
int temp = original[a];
original[a] = original[b];
original[b] = temp;
}
public int random(int start,int end){
return (start + (int)(Math.random()*(end-start+1)));
}
public void partition(int pivot, int start, int end){
swap(pivot,start); // swapping pivot and starting element in that subarray
int pivot_value = original[start];
lt = start;
gt = end;
int i = start;
while(i <= gt) {
if(original[i] < pivot_value) {
swap(lt, i);
lt++;
i++;
}
if(original[i] > pivot_value) {
swap(gt, i);
gt--;
}
if(original[i] == pivot_value)
i++;
}
}
public void Sort(int start, int end){
if(start < end) {
int pivot = random(start,end); // choose the index for pivot randomly
partition(pivot, start, end); // about index the array is partitioned
Sort(start, lt-1);
Sort(gt+1, end);
}
}
public void Sort(){
Sort(0,length-1);
}
public void disp(){
for(int i=0; i<length;++i){
System.out.print(original[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
QuickSortUsing3WayPartitioning qs = new QuickSortUsing3WayPartitioning(20);
qs.disp();
qs.Sort();
qs.disp();
}
}