#quicksort #insertion-sort #hybrid
#быстрая сортировка #вставка-сортировка #гибрид
Вопрос:
Гибридная сортировка:
индекс элемента массива A от int p до int r, мы сначала сортируем [] методом быстрой сортировки, pivot изначально помещается в конец массива, затем рекурсивно вызываем быструю сортировку, однако, поскольку количество элементов в массиве меньше t, мы прекращаем вызывать быструю сортировкусортируйте и сортируйте остаток элемента по сортировке по вставке, гибридная функция должна возвращать только время вызова сортировки по вставке. Основная функция распечатывает время вызова сортировки по вставке.
Я пишу этот код несколько раз, но всегда такой беспорядок во взаимосвязи функций, огромное количество информации об ошибках, которую я не могу диагностировать. и я не знаю, почему на практике это более быстрая реализация, чем объединение с randomized_quick_sort . Спасибо
#include<stdio.h>
#include<stdlib.h>
// hybrid quick sort
int hybridsort(int A[], int p, int q, int t);
int main() {
int n = 9, t = 3;
int A[9] = {1, 8, 6, 3, 2, 7, 4, 9, 10};
for(int i = 0; i < 9; i )printf(" %d", A[i]);
printf("n");
int res = hybridsort(A, 0, n - 1, t);// rest
printf("No. of calls = %dn",res);
for(int i = 0; i< 9; i )printf("%d", A[i]);
printf("n");
return 0;
}
int hybridsort(int A[], int p, int r, int t){
int n, count;
count = 0;
int i, j, key;
n = p - r 1;
// if No.elements < t, # of insertion sort gets called
if(n >= t amp;amp; p > r ){
quicksort(A, p, r);
}
else{
// insertionsort
count = count 1;
for(j = 1; j < 6; j ){
key = A[j];
i = j - 1;
while(i > -1 amp;amp; A[i] > key){
A[i 1] = A[i];
i = i - 1;
}
A[i 1] = key;
}
}
}
return count;
}
void quicksort(int A[], int p, int r){
int q ;
if(p < r){
q = partition(A, p,r);
quicksort(A, p, q - 1);
quicksort(A, q 1, r);
}
}
int partition(int A[], int p, int r){
int x, i, j, tmp;
x = A[r];//pivot
i = p - 1;
for(j = p; j < r; j ){
if(A[j] <= x){
i = 1;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
tmp = A[i 1];
A[i 1] = A[r];
A[r] = tmp;
return i 1 ;// pivot index position after sorting
}
Комментарии:
1. Для гибридной вставки быстрой сортировки быстрая сортировка должна вызывать сортировку по вставке для меньших размеров подмассива. В моем ответе я решил использовать сортировку вставки, если размер <= 32 элемента.
Ответ №1:
Пример гибридной быстрой сортировки сортировка по вставке. Основная программа вызовет QuickSort() , которая вызовет InsertionSort для размеров подмассива <= 32.
void InsertionSort(int a[], size_t lo, size_t hi)
{
size_t i = lo 1;
size_t j;
int t;
while(i <= hi){
t = a[i];
j = i;
while((j > lo) amp;amp; a[j-1] > t){
a[j] = a[j-1];
j -= 1;
}
a[j] = t;
i = 1;
}
}
void QuickSort(int a[], size_t lo, size_t hi)
{
if(lo >= hi)
return;
if((hi-lo) < 32){
InsertionSort(a, lo, hi);
return;
}
int pivot = a[lo (hi - lo) / 2];
int t;
size_t i = lo - 1;
size_t j = hi 1;
while(1)
{
while (a[ i] < pivot);
while (a[--j] > pivot);
if (i >= j)
break;
t = a[i];
a[i] = a[j];
a[j] = t;
}
QuickSort(a, lo, j);
QuickSort(a, j 1, hi);
}
Комментарии:
1. Хотя это один из элементарных алгоритмов сортировки с наихудшим временем O (n2), сортировка по вставке является алгоритмом выбора либо когда данные почти отсортированы (потому что они адаптивны), либо когда размер задачи невелик (потому что он имеет низкие накладные расходы). По этим причинам, а также потому, что она также стабильна, сортировка по вставке часто используется в качестве рекурсивного базового варианта (когда размер задачи невелик) для алгоритмов сортировки «разделяй и властвуй» с большими накладными расходами, таких как сортировка слиянием или быстрая сортировка. toptal.com/developers/sorting-algorithms # Я видел это из другого поста
2. Спасибо за вашу поддержку с самого начала, я думаю, что мой код похож на мусор code.visualstudio.com/docs/editor/debugging и я пытаюсь использовать инструмент для отладки, но на этот раз я действительно не знаю, почему мой код не работает. не могли бы вы дать мне дополнительные комментарии по возможному коду? Я видел, что вы много ответили о сортировке, какой-то технический анализ выходит за рамки моего понимания, поэтому сейчас я просто сосредоточен в основном на коде
3. int pivot = a [lo (hi — lo) / 2]; Это то же самое с ‘int pivot = (lo hi) / 2’? но ваша версия позволяет программе выбирать среднюю точку поворота для каждого подмассива с элементом _num> t и избегать переполнения? Это то же самое, что и при выборе случайного поворота в принципе?
4. гибридная функция должна возвращать только время вызова сортировки по вставке. это был вопрос hw, и они использовали только гибридную сортировку и основную (только две функции)
5. Не слишком ли просто, что я должен переключиться на форум для начинающих ^^?