V tomto kurzu se dozvíte, jak funguje třídění prostředí. Také najdete pracovní příklady třídění prostředí v C, C ++, Java a Python.
Shell sort je algoritmus, který nejprve seřadí prvky daleko od sebe a postupně snižuje interval mezi prvky, které mají být tříděny. Jedná se o zobecněnou verzi řazení.
V prostředí shell jsou tříděny prvky v určitém intervalu. Interval mezi prvky se postupně snižuje na základě použité sekvence. Výkon třídění prostředí závisí na typu sekvence použité pro dané vstupní pole.
Některé z použitých optimálních sekvencí jsou:
- Původní sekvence Shell:
N/2 , N/4 ,… , 1
- Knuthovy přírůstky:
1, 4, 13,… , (3k - 1) / 2
- Sedgewickovy přírůstky:
1, 8, 23, 77, 281, 1073, 4193, 16577… 4j+1+ 3·2j+ 1
- Hibbardovy přírůstky:
1, 3, 7, 15, 31, 63, 127, 255, 511…
- Přírůstek Papernova a Staseviče:
1, 3, 5, 9, 17, 33, 65,…
- Pratt:
1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81… .
Jak Shell Sort funguje?
- Předpokládejme, že musíme seřadit následující pole.
Počáteční pole
- Původní sekvenci shellu používáme
(N/2, N/4,… 1
jako intervaly v našem algoritmu.
V první smyčce, pokud je velikost poleN = 8
pak, jsou prvky ležící v intervaluN/2 = 4
porovnány a vyměněny, pokud nejsou v pořádku.- 0. prvek je porovnáván se 4. prvkem.
- Pokud je 0. prvek větší než 4., pak je 4. prvek nejprve uložen do
temp
proměnné a0th
prvek (tj. Větší prvek) je uložen na4th
pozici a prvek uložený vtemp
je uložen na0th
pozici.Změna uspořádání prvků v intervalu n / 2
Tento proces pokračuje u všech zbývajících prvků.Uspořádejte všechny prvky v intervalu n / 2
- Ve druhé smyčce se provede interval
N/4 = 8/4 = 2
a znovu se roztřídí prvky ležící v těchto intervalech.Uspořádání prvků v intervalu n / 4
V tomto okamžiku můžete být zmatení.Všechny prvky v poli ležící v aktuálním intervalu jsou porovnány. Porovnávají se
prvky na 4. a2nd
pozici. Rovněž0th
jsou porovnány prvky na 2. a pozici. Všechny prvky v poli ležící v aktuálním intervalu jsou porovnány. - Stejný proces pokračuje pro zbývající prvky.
Uspořádejte všechny prvky v intervalu n / 4
- Nakonec, když je interval
N/8 = 8/8 =1
pak, jsou prvky pole ležící v intervalu 1 seřazeny. Pole je nyní zcela tříděno.Uspořádejte prvky v intervalu n / 8
Algoritmus třídění skořápky
shellSort (pole, velikost) pro interval i <- velikost / 2n až 1 pro každý interval "i" v poli seřadit všechny prvky v intervalu "i" konec shellSort
Python, Java a C / C ++ příklady
Python Java C C ++# Shell sort in python def shellSort(array, n): # Rearrange elements at each n/2, n/4, n/8,… intervals interval = n // 2 while interval> 0: for i in range(interval, n): temp = array(i) j = i while j>= interval and array(j - interval)> temp: array(j) = array(j - interval) j -= interval array(j) = temp interval //= 2 data = (9, 8, 3, 7, 5, 6, 4, 1) size = len(data) shellSort(data, size) print('Sorted Array in Ascending Order:') print(data)
// Shell sort in Java programming import java.util.Arrays; // Shell sort class ShellSort ( // Rearrange elements at each n/2, n/4, n/8,… intervals void shellSort(int array(), int n) ( for (int interval = n / 2; interval> 0; interval /= 2) ( for (int i = interval; i = interval && array(j - interval)> temp; j -= interval) ( array(j) = array(j - interval); ) array(j) = temp; ) ) ) // Driver code public static void main(String args()) ( int() data = ( 9, 8, 3, 7, 5, 6, 4, 1 ); int size = data.length; ShellSort ss = new ShellSort(); ss.shellSort(data, size); System.out.println("Sorted Array in Ascending Order: "); System.out.println(Arrays.toString(data)); ) )
// Shell Sort in C programming #include // Shell sort void shellSort(int array(), int n) ( // Rearrange elements at each n/2, n/4, n/8,… intervals for (int interval = n / 2; interval> 0; interval /= 2) ( for (int i = interval; i = interval && array(j - interval)> temp; j -= interval) ( array(j) = array(j - interval); ) array(j) = temp; ) ) ) // Print an array void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) ( printf("%d ", array(i)); ) printf(""); ) // Driver code int main() ( int data() = (9, 8, 3, 7, 5, 6, 4, 1); int size = sizeof(data) / sizeof(data(0)); shellSort(data, size); printf("Sorted array: "); printArray(data, size); )
// Shell Sort in C++ programming #include using namespace std; // Shell sort void shellSort(int array(), int n) ( // Rearrange elements at each n/2, n/4, n/8,… intervals for (int interval = n / 2; interval> 0; interval /= 2) ( for (int i = interval; i = interval && array(j - interval)> temp; j -= interval) ( array(j) = array(j - interval); ) array(j) = temp; ) ) ) // Print an array void printArray(int array(), int size) ( int i; for (i = 0; i < size; i++) cout << array(i) << " "; cout << endl; ) // Driver code int main() ( int data() = (9, 8, 3, 7, 5, 6, 4, 1); int size = sizeof(data) / sizeof(data(0)); shellSort(data, size); cout << "Sorted array: "; printArray(data, size); )
Složitost
Shell sort je nestabilní třídicí algoritmus, protože tento algoritmus nezkoumá prvky ležící mezi intervaly.
Časová složitost
- Složitost nejhoršího případu : Složitost nejhoršího případu pro třídění shellu je vždy menší nebo rovna . Podle Poonen Věty, v nejhorším případě složitost pro shell druhu je nebo nebo nebo něco mezi tím.
O(n2)
O(n2)
Θ(Nlog N)2/(log log N)2)
Θ(Nlog N)2/log log N)
Θ(N(log N)2)
- Složitost nejlepších případů :
O(n*log n)
Když je pole již tříděno, celkový počet srovnání pro každý interval (nebo přírůstek) se rovná velikosti pole. - Průměrná složitost případu :
O(n*log n)
Je to kolem .O(n1.25)
Složitost závisí na zvoleném intervalu. Výše uvedené složitosti se liší pro různé zvolené přírůstkové sekvence. Nejlepší přírůstková sekvence není známa.
Složitost prostoru:
Složitost prostoru pro třídění mušlí je O(1)
.
Shell Sort Applications
Třídění prostředí se používá, když:
- volání zásobníku je režie. Knihovna uClibc používá tento druh.
- rekurze překračuje limit. bzip2 kompresor to používá.
- Třídění vložení nefunguje dobře, když jsou blízké prvky daleko od sebe. Třídění skořápky pomáhá snižovat vzdálenost mezi blízkými prvky. Bude tedy proveden menší počet swapů.