shell sort c with examples
Shell Sort Technique v C ++: Kompletní přehled.
Třídění prostředí je často označováno jako vylepšení oproti řazení. V třídění vložení vezmeme přírůstky o 1, abychom porovnali prvky a umístili je do správné polohy.
V prostředí shell je seznam seřazen rozdělením do několika menších sublistů. Není nutné, aby seznamy musely obsahovat souvislé prvky. Technika třídění skořápek místo toho používá přírůstek i, který se také nazývá „mezera“, a používá jej k vytvoření seznamu prvků, které jsou od sebe prvky „i“.
=> Prohlédněte si zde Úplný seznam výukových programů C ++.
java základní otázky a odpovědi na rozhovor
Co se naučíte:
Obecný algoritmus
Obecný algoritmus pro třídění prostředí je uveden níže.
shell_sort (A, N)
kde A - seznam k seřazení; N - gap_size
set gap_size = N, flag = 1
zatímco gap_size> 1 nebo flag = 1, opakujte
začít
nastavit příznak = 0
set gap_size = (gap_size + 1) / 2
konec
pro i = 0 až i<(N-gap_size) repeat
začít
pokud A (i + gap_size)> A (i)
vyměnit A (i + gap_size), A (i)
nastavit příznak = 0
konec
konec
Ve výše uvedeném algoritmu jsme tedy nejprve nastavili N, což je mezera pro třídění pole A pomocí třídění podle shellu. V dalším kroku rozdělíme pole na mezipole pomocí mezery. Pak v dalším kroku roztřídíme každé z dílčích polí, takže na konci smyčky dostaneme seřazené pole.
Dále uvažujme podrobný příklad, abychom lépe porozuměli řazení podle obrazového znázornění.
Ilustrace
Pojďme si ilustrovat Shell řazení příkladem.
Zvažte následující pole 10 prvků.
Pokud poskytneme mezeru 3, pak budeme mít následující dílčí seznamy s každým prvkem, který je od sebe vzdálený 3 prvky. Tyto tři podseznamy potom roztřídíme.
Níže jsou uvedeny seřazené dílčí seznamy a výsledný seznam, který získáme po sloučení tří seřazených sublistů.
Výše uvedené pole, které jsme získali po sloučení seřazených dílčích polí, je téměř tříděno. Nyní můžeme v tomto seznamu provést třídění vložení a třídit celé pole. Tento poslední krok je uveden níže pro vaši potřebu.
Jak je vidět výše, po provedení třídění prostředí a sloučení seřazených sublistů jsme k úplnému řazení seznamu potřebovali pouze tři tahy. Vidíme tedy, že můžeme výrazně snížit počet kroků potřebných k seřazení pole.
Volba přírůstku k vytvoření dílčích seznamů je jedinečnou vlastností třídění prostředí.
Příklad C ++
Podívejme se níže na implementaci třídění prostředí v C ++.
#include using namespace std; // shellsort implementation int shellSort(int arr(), int N) { for (int gap = N/2; gap > 0; gap /= 2) { for (int i = gap; i = gap && arr(j - gap) > temp; j -= gap) arr(j) = arr(j - gap); arr(j) = temp; } } return 0; } int main() { int arr() = {45,23,53,43,18,24,8,95,101}, i; //Calculate size of array int N = sizeof(arr)/sizeof(arr(0)); cout << 'Array to be sorted:
'; for (int i=0; i Výstup:
Pole k třídění:
45 23 53 43 18 24 8 95 101
Pole po třídění skořápky:
8 18 23 24 43 45 53 95101
Použili jsme stejný seznam, který jsme použili na ilustraci, a vidíme, že začneme nejprve vytvořením dvou dílčích seznamů a dalším zmenšením mezery. Jakmile jsou dílčí seznamy vytvořeny podle zadané mezery, seřadíme každý dílčí seznam. Po seřazení všech dílčích seznamů získáme téměř seřazený seznam. Nyní lze tento seznam třídit pomocí základního třídění vložení, které zabere jen velmi málo tahů.
Dále implementujeme třídění prostředí pomocí jazyka Java.
Příklad Java
// Java class for ShellSort class ShellSort { //function to sort the array using shell sort int sort(int arr()) { int N = arr.length; // Start with a big gap, then narrow the gap for (int gap = N/2; gap > 0; gap /= 2) { //sort sub lists created by applying gap for (int i = gap; i = gap && arr(j - gap) > temp; j -= gap) arr(j) = arr(j - gap); arr(j) = temp; } } return 0; } } class Main{ public static void main(String args()) { int arr() = {45,23,53,43,18,24,8,95,101}; int N = arr.length; System.out.println('Array to be sorted: '); for (int i=0; i Výstup:
Pole k třídění:
45 23 53 43 18 24 8 95 101
Pole po třídění skořápky:
8 18 23 24 43 45 53 95101
Implementovali jsme stejnou logiku pro třídění prostředí v programech C ++ i Java. Jak je tedy vysvětleno výše v programu Java, nejprve rozdělíme pole na dílčí pole a poté je roztřídíme, abychom získali úplné seřazené pole.
Závěr
Shell sort je vysoce efektivní algoritmus, který přináší zlepšení oproti druhu vkládání.
Zatímco třídění vkládání funguje tak, že jeho prvky se zvyšují o 1, třídění prostředí používá parametr „mezera“ k rozdělení pole do dílčích polí, jejichž prvky jsou od sebe „mezerou“. Pak můžeme třídit jednotlivé seznamy pomocí vloženého řazení, abychom získali kompletní seřazené pole.
Třídění skořepiny funguje rychleji než třídění s vložením a ve srovnání s třídou vložení trvá třídění pole méně. Náš nadcházející výukový program prozkoumá vše o technice třídění haldy pro třídění datových struktur.
=> Navštivte zde a dozvíte se C ++ od nuly.
Doporučené čtení