Šajā apmācībā jūs uzzināsiet, kā darbojas čaulas kārtošana. Jūs atradīsit arī čaulu kārtošanas piemērus C, C ++, Java un Python.
Apvalka kārtošana ir algoritms, kas vispirms kārto elementus tālu viens no otra un secīgi samazina intervālu starp kārtoamajiem elementiem. Tā ir vispārināta ievietošanas veida versija.
Čaulas kārtošanā elementi ar noteiktu intervālu tiek sakārtoti. Intervāls starp elementiem tiek pakāpeniski samazināts, pamatojoties uz izmantoto secību. Čaulas kārtošanas veiktspēja ir atkarīga no secības veida, kas tiek izmantota attiecīgajam ievades masīvam.
Dažas no optimālākajām izmantotajām sekvencēm ir:
- Shell sākotnējā secība:
N/2 , N/4 ,… , 1
- Knuta solis:
1, 4, 13,… , (3k - 1) / 2
- Sedžvika pakāpieni:
1, 8, 23, 77, 281, 1073, 4193, 16577… 4j+1+ 3·2j+ 1
- Hibarda solis:
1, 3, 7, 15, 31, 63, 127, 255, 511…
- Papernova un Staseviča pieaugums:
1, 3, 5, 9, 17, 33, 65,…
- Pratt:
1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81… .
Kā darbojas čaulas kārtošana?
- Pieņemsim, ka mums ir jāšķiro šāds masīvs.
Sākotnējais masīvs
(N/2, N/4,… 1
Algoritmā kā intervālus izmantojam čaulas sākotnējo secību ).
Pirmajā cilpā, ja masīva lielums irN = 8
tad, elementi, kas atrodas intervālā,N/2 = 4
tiek salīdzināti un samainīti, ja tie nav kārtībā.- 0. elements tiek salīdzināts ar 4. elementu.
- Ja 0. elements ir lielāks par ceturto, tad 4. elements vispirms tiek saglabāts
temp
mainīgajā lielumā un0th
elements (ti, lielāks elements) tiek saglabāts4th
pozīcijā, un elements, kas glabājas,temp
tiek saglabāts0th
pozīcijā.Pārkārtojiet elementus ar n / 2 intervālu
Šis process turpinās visiem pārējiem elementiem.Pārkārtojiet visus elementus ar n / 2 intervālu
- Otrajā cilpā
N/4 = 8/4 = 2
tiek ņemts intervāls un atkal tiek sakārtoti šajos intervālos gulošie elementi.Pārkārtojiet elementus ar n / 4 intervālu
Šajā brīdī jūs varat sajaukt.Visi masīva elementi, kas atrodas pašreizējā intervālā, tiek salīdzināti.
Tiek salīdzināti 4. un2nd
pozīcijas elementi . Tiek0th
salīdzināti arī elementi 2. un pozīcijā. Visi masīva elementi, kas atrodas pašreizējā intervālā, tiek salīdzināti. - Tas pats process notiek arī attiecībā uz atlikušajiem elementiem.
Pārkārtojiet visus elementus ar n / 4 intervālu
- Visbeidzot, kad intervāls ir,
N/8 = 8/8 =1
tiek sakārtoti masīva elementi, kas atrodas intervālā 1. Masīvs tagad ir pilnībā sakārtots.Pārkārtojiet elementus ar n / 8 intervālu
Korpusa kārtošanas algoritms
shellSort (masīvs, izmērs) intervālam i <- size / 2n līdz 1 katram intervālam "i" masīvā kārtot visus elementus intervālā "i" beigu shellSort
Python, Java un C / C ++ piemēri
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); )
Sarežģītība
Korpusa kārtošana ir nestabils šķirošanas algoritms, jo šis algoritms nepārbauda elementus, kas atrodas starp intervāliem.
Laika sarežģītība
- Sliktākā gadījuma sarežģītība : mazāka vai vienāda ar sliktākā gadījuma sarežģītību čaulas kārtošanai vienmēr ir mazāka vai vienāda ar . Saskaņā ar Poonena teorēmu sliktākajā gadījumā čaulas veida sarežģītība ir vai vai vai kaut kas pa vidu .
O(n2)
O(n2)
Θ(Nlog N)2/(log log N)2)
Θ(Nlog N)2/log log N)
Θ(N(log N)2)
- Labākā gadījuma sarežģītība :
O(n*log n)
kad masīvs jau ir sakārtots, kopējais salīdzinājumu skaits katram intervālam (vai pieaugumam) ir vienāds ar masīva lielumu. - Vidējā lietu sarežģītība :
O(n*log n)
tā ir aptuveni .O(n1.25)
Sarežģītība ir atkarīga no izvēlētā intervāla. Iepriekš minētās sarežģītības atšķiras dažādām izvēlētām pieauguma secībām. Labākā pieauguma secība nav zināma.
Kosmosa sarežģītība:
Telpu sarežģītība čaulas kārtošanai ir O(1)
.
Shell kārtot lietojumprogrammas
Apvalka kārtošana tiek izmantota, ja:
- kaudzes izsaukšana ir virs galvas. uClibc bibliotēka izmanto šo veidu.
- rekursija pārsniedz robežu. bzip2 kompresors to izmanto.
- Ievietošanas kārtošana nedarbojas labi, ja tuvie elementi atrodas tālu viens no otra. Korpusa kārtošana palīdz samazināt attālumu starp tuvajiem elementiem. Tādējādi būs mazāks veicamo maiņu skaits.