Shell Sort-algoritme met voorbeeld

โšก Slimme samenvatting

Shell Sort is een in-place vergelijkingsalgoritme dat insertion sort generaliseert door elementen die ver van elkaar verwijderd zijn te vergelijken en vervolgens de afstand te verkleinen totdat aangrenzende elementen gesorteerd zijn.

  • ๐Ÿ“Š Definitie: Een in-place generalisatie van insertion sort, voorgesteld door Donald Shell in 1959, die gebruikmaakt van een aflopende gap-sequentie.
  • ๐Ÿ”€ Gap-reeksen: De oorspronkelijke reeks van Shell is n/2, n/4, โ€ฆ, 1; de reeksen van Knuth, Sedgewick en Ciura presteren in de praktijk beter.
  • โšก complexiteit: O(n log n) in het beste geval, O(n^2) in het slechtste geval, en O(1) aan hulpruimte.
  • โœ… Gebruik Gevallen: De Linux-kernel, uClibc en bzip2 gebruiken Shell Sort om recursie en extra stackgeheugen te vermijden.
  • ๐Ÿค– AI-hoek: AI-assistenten kunnen suggesties doen voor het samenstellen van gatenreeksen en op verzoek geanimeerde visualisaties van Shell Sort genereren.

Wat is Shell Sort?

Shell Sort, ook wel Shells methode genoemd, is een efficiรซnt sorteeralgoritme dat in-place sorteert op basis van vergelijkingen. Het is vernoemd naar Donald Shell, die het idee in 1959 introduceerde, en is een gegeneraliseerde uitbreiding van insertion sort die het kwadratische gedrag van insertion sort bij verspreide data overwint.

Het basisidee is om elementen die ver uit elkaar liggen te groeperen, elke groep te sorteren met behulp van invoegsortering en de afstand tussen de elementen stap voor stap te verkleinen totdat deze รฉรฉn is. Tegen die tijd is de array bijna gesorteerd.

Deze kloof, het interval, volgt een gekozen volgorde, zoals het origineel van Shell, Knuth, Hibbard of Sedgewick. Het origineel van Shell is n/2, n/4, ..., 1.

Shell-sorteeralgoritme

Stap 1) Initialiseer de intervalwaarde h = n/2, waarbij n de grootte van de array is.

Stap 2) Plaats alle elementen binnen een afstand van het interval h in een sublijst.

Stap 3) Sorteer elke sublijst met behulp van invoegsortering.

Stap 4) Stel een nieuw interval in: h = h/2.

Stap 5) Als h > 0, ga dan terug naar stap 2. Anders ga je naar stap 6.

Stap 6) De resulterende array is nu volledig gesorteerd.

Hoe Shell Sorteren werkt

Bij insertion sort verschuiven elementen slechts รฉรฉn positie per keer. Shell Sort verdeelt de array daarentegen in sublijsten met ruime tussenruimte op basis van het interval en voert insertion sort uit op elke sublijst.

Naarmate het interval kleiner wordt, neemt de grootte van de sublijst toe. Omdat eerdere stappen de gegevens gedeeltelijk gesorteerd achterlaten, vereisen kleinere intervallen veel minder wisselingen dan een volledige verwerking. invoegsoort van begin af aan. De onderstaande afbeelding illustreert รฉรฉn Shell Sort-doorgang.

Shell Sorteerwerken

De werking van het Shell Sort-algoritme met een voorbeeld.

Laten we de onderstaande array sorteren met behulp van Shell Sort.

Werking van het Shell Sort-algoritme

Stap 1) De arraygrootte is 8, dus de initiรซle intervalwaarde is h = 8/2 = 4.

Stap 2) Groepeer elementen met een tussenruimte van vier posities. Sublijsten: {8, 1}, {6, 4}, {7, 5}, {2, 3}.

Werking van het Shell Sort-algoritme

Stap 3) Sorteer elke sublijst met behulp van invoegsortering. Een tijdelijke variabele slaat de waarde op die wordt ingevoegd terwijl elementen verschuiven. Na de wisselingen ziet de array er als volgt uit.

Werking van het Shell Sort-algoritme

Stap 4) Verklein het interval. Het nieuwe interval is h = 4/2 = 2.

Stap 5) Omdat 2 > 0, ga terug naar stap 2 en groepeer de elementen op twee posities afstand: {1, 5, 8, 7} en {4, 2, 6, 3}.

Werking van het Shell Sort-algoritme

Sorteer de eerste sublijst. De array wordt:

Werking van het Shell Sort-algoritme

Na het sorteren van de tweede sublijst:

Werking van het Shell Sort-algoritme

Verklein het interval opnieuw naar h = 2/2 = 1. Met een tussenruimte van รฉรฉn voert Shell Sort een laatste invoegsorteerbewerking uit over de hele array, zoals hieronder weergegeven.

Werking van het Shell Sort-algoritme

Werking van het Shell Sort-algoritme

Werking van het Shell Sort-algoritme

Stap 6) Als je het interval opnieuw deelt, krijg je 0. De array is nu volledig gesorteerd.

Werking van het Shell Sort-algoritme

Pseudo-Code voor Shell Sort

Start
Input array a of size n
for (interval = n / 2; interval > 0; interval /= 2)
    for (i = interval; i < n; i += 1)
        temp = a[i];
        for (j = i; j >= interval && a[j - interval] > temp; j -= interval)
            a[j] = a[j - interval];
        a[j] = temp;
End

Shell-sorteerprogramma in C/C++

Input:

//Shell Sort Program in C/C++
#include <bits/stdc++.h>
using namespace std;
void ShellSort(int data[], int size) {
    for (int interval = size / 2; interval > 0; interval /= 2) {
        for (int i = interval; i < size; i += 1) {
            int temp = data[i];
            int j;
            for (j = i; j >= interval && data[j - interval] > temp; j -= interval) {
                data[j] = data[j - interval];
            }
            data[j] = temp;
        }
    }
}
int main() {
    int data[] = {8, 6, 7, 2, 1, 4, 5, 3};
    int size = sizeof(data) / sizeof(data[0]);
    ShellSort(data, size);
    cout << "Sorted Output: \n";
    for (int i = 0; i < size; i++)
        cout << data[i] << " ";
    cout << "\n";
}

Output:

Sorted Output:

1 2 3 4 5 6 7 8

Voorbeeld van shell-sortering in Python

Input:

#Shell Sort Example in Python
def ShellSort(data, size):
    interval = size // 2
    while interval > 0:
        for i in range(interval, size):
            temp = data[i]
            j = i
            while j >= interval and data[j - interval] > temp:
                data[j] = data[j - interval]
                j -= interval
            data[j] = temp
        interval //= 2
data = [8, 6, 7, 2, 1, 4, 5, 3]
ShellSort(data, len(data))
print('Sorted Output:')
print(data)

Output:

Sorted Output:
[1, 2, 3, 4, 5, 6, 7, 8]

Toepassingen van Shell Sort

Shell Sort wordt nog steeds gebruikt in moderne systemen waar stackruimte of eenvoud belangrijk zijn.

  • De Linux kernel Maakt gebruik van Shell Sort op plaatsen waar het vermijden van een aanroepstack van belang is.
  • De ingebedde C-bibliotheek uClibc gebruikt Shell Sort om het geheugenverbruik laag te houden.
  • bzip2 gebruikt Shell Sort om diepe recursie tijdens het sorteren van blokken te vermijden.
  • Ingebouwde firmware geeft de voorkeur aan Shell Sort voor kleine datasets waar recursie beperkt is.

Voordelen en nadelen van schelpsortering

Voordelen Nadelen
Er is geen aanroepstack nodig, wat ideaal is voor embedded systemen. Niet de snelste optie voor zeer grote arrays.
Eenvoudig te implementeren met een kleine hoeveelheid code. De prestaties verslechteren bij data met wijdverspreide elementen.
Efficiรซnt voor middelgrote of gedeeltelijk gesorteerde arrays. De tijdscomplexiteit in het slechtste geval is gevoelig voor de gekozen volgorde van de tussenruimtes.
Het werkt op dezelfde plek, dus het maakt gebruik van constant hulpgeheugen. Het is geen stabiele sortering, dus gelijke sleutels kunnen van volgorde veranderen.

Complexiteitsanalyse van shellsortering

Tijdscomplexiteit van shellsortering

De tijdscomplexiteit van Shell Sort hangt af van de gebruikte gap-sequentie.

In het beste geval, wanneer de array al bijna geordend is, heeft elke doorgang slechts een logaritmisch aantal tests nodig, wat O(n log n) oplevert.

In het slechtste geval is de array zo gerangschikt dat elementen het maximale aantal vergelijkingen nodig hebben, en de laatste incrementatie domineert met O(n^2) ten opzichte van Shells oorspronkelijke volgorde.

  1. Complexiteit in het beste geval: O(n log n)
  2. Gemiddelde complexiteit: O(n log n) tot O(n^(4/3)) afhankelijk van de volgorde van de gaten
  3. Worst-case complexiteit: O(n^2) met Shells oorspronkelijke sequentie

De beste algemene gap-sequentie is nog steeds onderwerp van onderzoek, hoewel de sequenties van Sedgewick en Ciura in de praktijk goed presteren.

Complexiteit van de shell-sorteerruimte

Shell Sort vereist geen hulpmatrices, waardoor de ruimtecomplexiteit O(1) is, ongeacht de grootte van de invoer. Dit is een van de grootste praktische voordelen.

Veelgestelde vragen

Shell Sort is een in-place vergelijkingssorteeralgoritme dat in 1959 werd voorgesteld door Donald Shell. Het is een generalisatie van insertion sort door elementen die ver van elkaar verwijderd zijn met elkaar te vergelijken en vervolgens de afstand te verkleinen totdat aangrenzende elementen gesorteerd zijn. Dit vermindert het aantal swaps aanzienlijk.

De tijdcomplexiteit in het beste geval is O(n log n), en de complexiteit in het slechtste geval is O(n^2) met Shells oorspronkelijke reeks. Betere gap-reeksen zoals die van Sedgewick reduceren het slechtste geval tot ongeveer O(n^(4/3)). De ruimtecomplexiteit is O(1).

Nee, Shell Sort is niet stabiel. Omdat elementen over grote afstanden worden vergeleken en verwisseld, kunnen twee gelijke sleutels van volgorde veranderen tijdens een sortering. Als stabiliteit belangrijk is, gebruik dan merge sort of een stabiele variant van insertion sort.

Bij insertion sort worden elementen รฉรฉn positie per keer verplaatst. Shell Sort vergelijkt eerst elementen die ver uit elkaar liggen en verkleint vervolgens geleidelijk de afstand ertussen. Het resultaat is een bijna gesorteerde array tegen de tijd dat de afstand รฉรฉn is, waardoor de laatste stap van insertion sort zeer snel is voltooid.

AI-assistenten kunnen de grootte, verdeling en beperkingen van uw dataset analyseren en vervolgens een algoritme aanbevelen, zoals Shell Sort, Quicksort of Radix Sort. Ze kunnen ook benchmarkscripts genereren die de uitvoeringstijd en het geheugengebruik vergelijken, zodat u de aanbeveling kunt valideren met behulp van echte workloads.

Ja. AI-tools kunnen geanimeerde visualisaties van Shell Sort genereren die groepen met hiaten, vergelijkingen en verwisselingen in realtime weergeven. Zulke visualisaties helpen leerlingen te zien hoe het interval kleiner wordt en hoe de array stap voor stap naar een gesorteerde toestand convergeert.

Vat dit bericht samen met: