I den här handledningen lär du dig hur skalsortering fungerar. Du hittar också arbetsexempel på skalsortering i C, C ++, Java och Python.
Skalsortering är en algoritm som först sorterar elementen långt ifrån varandra och successivt minskar intervallet mellan elementen som ska sorteras. Det är en generaliserad version av insättningssortering.
I skal sorteras sorteras element vid ett visst intervall. Intervallet mellan elementen minskas gradvis baserat på den använda sekvensen. Prestandan för skalsorteringen beror på vilken typ av sekvens som används för en given inmatningsmatris.
Några av de optimala sekvenserna som används är:
- Shells originalsekvens:
N/2 , N/4 ,… , 1
- Knuths steg:
1, 4, 13,… , (3k - 1) / 2
- Sedgewicks steg:
1, 8, 23, 77, 281, 1073, 4193, 16577… 4j+1+ 3·2j+ 1
- Hibbards steg:
1, 3, 7, 15, 31, 63, 127, 255, 511…
- Ökning av Papernov & Stasevich:
1, 3, 5, 9, 17, 33, 65,…
- Pratt:
1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81… .
Hur fungerar Shell Sort?
- Antag att vi måste sortera följande array.
Initial array
- Vi använder skalets ursprungliga sekvens
(N/2, N/4,… 1
) som intervall i vår algoritm.
I den första slingan, om matrisstorleken ärN = 8
då,N/2 = 4
jämförs elementen som ligger i intervallet och byter om de inte är i ordning.- Det 0: e elementet jämförs med det 4: e elementet.
- Om 0:e elementet är större än den 4:e man då, är den 4: e elementet först lagras i
temp
variabeln och0th
elementet (dvs. Större inslag) lagras i den4th
positionen och elementet lagras itemp
lagras i0th
positionen.Ordna om elementen med n / 2-intervall
Denna process fortsätter för alla återstående element.Ordna om alla element med n / 2-intervall
- I den andra slingan
N/4 = 8/4 = 2
tas ett intervall av och igen sorteras elementen som ligger vid dessa intervall.Ordna om elementen med n / 4-intervall
Du kan bli förvirrad vid denna tidpunkt.Alla element i matrisen som ligger vid det aktuella intervallet jämförs.
Elementen på 4: e och2nd
position jämförs. Elementen vid 2: a och0th
position jämförs också. Alla element i matrisen som ligger vid det aktuella intervallet jämförs. - Samma process fortsätter för återstående element.
Ordna om alla element i intervallet n / 4
- Slutligen, när intervallet är,
N/8 = 8/8 =1
sorteras arrayelementen som ligger i intervallet 1. Arrayen är nu helt sorterad.Ordna om elementen i intervallet n / 8
Skalsorteringsalgoritm
shellSort (array, storlek) för intervall i <- storlek / 2n ner till 1 för varje intervall "i" i arrayen sortera alla element vid intervallet "i" end shellSort
Python, Java och C / C ++ exempel
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); )
Komplexitet
Skalsortering är en instabil sorteringsalgoritm eftersom denna algoritm inte undersöker elementen som ligger mellan intervallen.
Tidskomplexitet
- Värsta fallets komplexitet : mindre än eller lika med värsta fallets komplexitet för skalsortering är alltid mindre än eller lika med . Enligt Poonen Sats är värsta fall komplexiteten för shell sort eller eller eller något däremellan.
O(n2)
O(n2)
Θ(Nlog N)2/(log log N)2)
Θ(Nlog N)2/log log N)
Θ(N(log N)2)
- Bästa fallskomplexitet :
O(n*log n)
När matrisen redan är sorterad är det totala antalet jämförelser för varje intervall (eller steg) lika med storleken på matrisen. - Genomsnittlig fallkomplexitet :
O(n*log n)
Det är runt .O(n1.25)
Komplexiteten beror på det valda intervallet. Ovanstående komplexiteter skiljer sig åt för olika valda steg. Bästa stegvisa sekvensen är okänd.
Rymdkomplexitet:
Utrymmets komplexitet för skalsortering är O(1)
.
Shell Sortera applikationer
Skalsortering används när:
- att kalla en stack är overhead. uClibc-biblioteket använder den här typen.
- rekursion överskrider en gräns. bzip2 kompressor använder den.
- Insättningssortering fungerar inte bra när de nära elementen ligger långt ifrån varandra. Skalsortering hjälper till att minska avståndet mellan de nära elementen. Således blir det mindre antal byten som ska utföras.