I denne vejledning lærer du, hvordan shell-sortering fungerer. Du finder også arbejdseksempler på shell-sortering i C, C ++, Java og Python.
Shell-sortering er en algoritme, der først sorterer elementerne langt fra hinanden og successivt reducerer intervallet mellem de elementer, der skal sorteres. Det er en generaliseret version af indsættelsessortering.
I shell-sortering sorteres elementer med et bestemt interval. Intervallet mellem elementerne reduceres gradvist baseret på den anvendte sekvens. Ydelsen af shell-sorteringen afhænger af typen af sekvens, der bruges til et givet input-array.
Nogle af de optimale anvendte sekvenser er:
- Shells originale sekvens:
N/2 , N/4 ,… , 1
- Knuth's trin:
1, 4, 13,… , (3k - 1) / 2
- Sedgewicks trin:
1, 8, 23, 77, 281, 1073, 4193, 16577… 4j+1+ 3·2j+ 1
- Hibbards trin:
1, 3, 7, 15, 31, 63, 127, 255, 511…
- Papernov & Stasevich stigning:
1, 3, 5, 9, 17, 33, 65,…
- Pratt:
1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81… .
Hvordan fungerer Shell Sort?
- Antag, at vi skal sortere følgende array.
Indledende array
- Vi bruger skalets originale sekvens
(N/2, N/4,… 1
) som intervaller i vores algoritme.
I den første loop, hvis matrixstørrelsen erN = 8
,N/2 = 4
sammenlignes elementerne, der ligger i intervallet, og byttes, hvis de ikke er i orden.- Det 0. element sammenlignes med det 4. element.
- Hvis det 0. element er større end det fjerde, lagres det 4. element først i
temp
variabel, og0th
elementet (dvs. større element) lagres i4th
positionen, og elementet, der er gemt itemp
, lagres i0th
positionen.Omarranger elementerne med n / 2-interval
Denne proces fortsætter for alle de resterende elementer.Omarranger alle elementerne med n / 2-intervallet
- I den anden sløjfe tages et interval på
N/4 = 8/4 = 2
, og igen sorteres elementerne, der ligger ved disse intervaller.Omarranger elementerne med n / 4 interval
Du kan blive forvirret på dette tidspunkt.Alle elementer i arrayet, der ligger i det aktuelle interval, sammenlignes.
Elementerne på 4. og2nd
position sammenlignes. Elementerne på 2. og0th
position sammenlignes også. Alle elementer i arrayet, der ligger i det aktuelle interval, sammenlignes. - Den samme proces fortsætter for de resterende elementer.
Omarranger alle elementerne med n / 4-intervallet
- Endelig, når intervallet er,
N/8 = 8/8 =1
sorteres arrayelementerne, der ligger i intervallet 1. Arrayet er nu fuldstændigt sorteret.Omarranger elementerne med n / 8-intervallet
Skalsorteringsalgoritme
shellSort (array, størrelse) for interval i <- størrelse / 2n ned til 1 for hvert interval "i" i array sorterer alle elementerne i interval "i" end shellSort
Python, Java og C / C ++ eksempler
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); )
Kompleksitet
Shell-sortering er en ustabil sorteringsalgoritme, fordi denne algoritme ikke undersøger de elementer, der ligger mellem intervallerne.
Tidskompleksitet
- Kompleksitet i værste tilfælde : mindre end eller lig med kompleksiteten i værste tilfælde er altid mindre end eller lig med . Ifølge Poonen Sætning, værste fald kompleksitet for skallen slags er eller eller eller noget midt imellem.
O(n2)
O(n2)
Θ(Nlog N)2/(log log N)2)
Θ(Nlog N)2/log log N)
Θ(N(log N)2)
- Best case-kompleksitet :
O(n*log n)
Når arrayet allerede er sorteret, er det samlede antal sammenligninger for hvert interval (eller inkrement) lig med størrelsen på arrayet. - Gennemsnitlig sagskompleksitet :
O(n*log n)
Det er omkring .O(n1.25)
Kompleksiteten afhænger af det valgte interval. Ovenstående kompleksitet adskiller sig for forskellige valgte sekvenser. Bedste forøgelsessekvens er ukendt.
Rumkompleksitet:
Rumkompleksiteten for skalesortering er O(1)
.
Shell Sort applikationer
Skalsortering bruges, når:
- at kalde en stak er overhead. uClibc-biblioteket bruger denne slags.
- rekursion overstiger en grænse. bzip2 kompressor bruger det.
- Indsætningssortering fungerer ikke godt, når de tætte elementer er langt fra hinanden. Skalsortering hjælper med at reducere afstanden mellem de tætte elementer. Således vil der være færre antal swappings, der skal udføres.