Sortering efter simple udvekslinger , sortering efter en boble ( engelsk bubble sort ) er en simpel sorteringsalgoritme . At forstå og implementere denne algoritme er den enkleste, men den er kun effektiv for små arrays. Algoritmens kompleksitet : .
Algoritmen betragtes som pædagogisk og bruges praktisk talt ikke uden for undervisningslitteraturen, i stedet bruges mere effektive sorteringsalgoritmer i praksis. Samtidig ligger udvekslingssorteringsmetoden til grund for nogle af de mere avancerede algoritmer, såsom shaker sort , heap sort og quick sort .
Algoritmen består af gentagne gennemløb gennem det sorterede array. For hver gennemgang sammenlignes elementerne sekventielt i par, og hvis rækkefølgen i parret er forkert, permuteres elementerne. Gennemløb gennem arrayet gentages én gang, eller indtil det ved næste gennemløb viser sig, at udvekslingerne ikke længere er nødvendige, hvilket betyder, at arrayet er sorteret. Med hver passage af algoritmen gennem den indre sløjfe sættes det næststørste element i arrayet på plads i slutningen af arrayet ved siden af det forrige "største element", og det mindste element flytter en position til begyndelsen af arrayet. array ("flyder" til den ønskede position, som en boble i vand - deraf og navnet på algoritmen).
Sværhedsgrad :.
Worst case:
Bedste tilfælde (allerede sorteret array er input):
Det særlige ved denne algoritme er som følger: efter den første afslutning af den indre løkke er det maksimale element i arrayet altid i den -th position. På det andet gennemløb er det næststørste element på plads. Og så videre. Ved hver efterfølgende gennemgang reduceres antallet af behandlede elementer med 1, og der er ikke behov for at "traverse" hele arrayet fra start til slut hver gang.
Da en underarray af et element ikke skal sorteres, kræver sortering ikke mere end iterationer af den ydre sløjfe. Derfor kører den ydre sløjfe i nogle implementeringer altid problemfrit og holder ikke styr på, om der var eller ikke var udvekslinger ved hver iteration.
Indførelsen af en indikator (flag F) for faktiske udvekslinger i den indre sløjfe reducerer antallet af ekstra gennemløb i tilfælde med delvist sorterede input-arrays. Før hver passage gennem den indre sløjfe nulstilles flaget til 0, og efter udvekslingen faktisk fandt sted, sættes det til 1. Hvis flaget er 0 efter at have forladt den indre sløjfe, var der ingen udvekslinger, det vil sige arrayet er sorteret, og du kan afslutte sorteringsprogrammet før tidsplanen.
Pseudokode til en endnu mere forbedret algoritme med kontrol for virkelig forekomne udvekslinger i den indre løkke.
Input: matrix bestående af elementer, nummereret fra til
SLØKKE FOR J = 1 TIL N - 1 TRIN 1 FOR J = 1 TIL N - 1 TRIN 1 F = 0 F = 0 SLØKKE FOR I = 0 TIL N - 1 - J TRIN 1 FOR I = 0 TIL N - 1 - J TRIN 1 HVIS A [ I ] > A [ I + 1 ] SÅ BYT A [ I ], A [ I + 1 ]: F = 1 HVIS A [ I ] > A [ I + 1 ] SÅ SWAP A [ I ], A [ I + 1 ]: F = 1 NÆSTE I NÆSTE I HVIS F = 0 SÅ AFSLUT LOOP HVIS F = 0 SÅ AFSLUT FOR NÆSTE J NÆSTE JI tilfælde af en tidlig exit fra sortering, gør denne algoritme én overflødig gennemgang uden udvekslinger.
Worst case (forbedrer ikke):
Bedste tilfælde (forbedret):
Tidspunktet for sortering af 10.000 korte heltal på det samme hardware-software kompleks (sammenligningsoperation ≈3,4 µs, udveksling ≈2,3 µs) efter udvælgelsessortering var ≈40 sek., ved endnu mere forbedret boblesortering ≈30 sek. og ved hurtig sortering ≈ 0,027 sek.
større end merge sort , men i det små er forskellen ikke særlig stor, og programkoden er meget enkel, så det er helt acceptabelt at bruge bubble sort til mange opgaver med lavdimensionelle arrays på inaktive og let belastede maskiner.
Algoritmen kan forbedres en smule ved at gøre følgende:
I boblesortering kan du med hver passage gennem den indre sløjfe tilføje definitionen af det næste minimumselement og placere det i begyndelsen af arrayet, det vil sige kombinere boblesorterings- og selektionssorteringsalgoritmerne , mens antallet af passeringer igennem den indre løkke halveres, men antallet af sammenligninger og en udveksling tilføjes efter hver passage gennem den indre løkke.
Pseudokode for den kombinerede boblesorterings- og selektionssorteringsalgoritme ( stabil implementering):
FOR J = 0 TIL N - 1 TRIN 1 F = 0 MIN = J FOR I = J TIL N - 1 - J TRIN 1 HVIS Y [ I ] > Y [ I + 1 ] SÅ SKIFTS Y [ I ], Y [ I 1 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Lad os tage en matrix med tallene "5 1 4 2 8" og sortere værdierne i stigende rækkefølge ved hjælp af boblesortering. De elementer, der sammenlignes på dette stadium, er fremhævet.
Første pass:
( 5 1 4 2 8) ( 1 5 4 2 8), Her sammenligner algoritmen de to første elementer og bytter dem. (1 5 4 2 8) (1 4 5 2 8), Bytter pga (1 4 5 2 8) (1 4 2 5 8), Bytter pga (1 4 2 5 8 ) (1 4 2 5 8 ), Nu, da elementerne er på deres pladser ( ), bytter algoritmen dem ikke.Andet gennemløb:
( 1 4 2 5 8) ( 1 4 2 5 8) (1 4 2 5 8) (1 2 4 5 8), Bytter pga (1 2 4 5 8) (1 2 4 5 8)Nu er arrayet fuldstændigt sorteret, men det ved algoritmen ikke. Derfor skal han lave en fuld aflevering og fastslå, at der ikke var nogen permutationer af elementer.
Tredje pas:
( 1 2 4 5 8) ( 1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8)Nu er arrayet sorteret, og algoritmen kan fuldføres.
Ordbøger og encyklopædier |
---|
Sorteringsalgoritmer | |
---|---|
Teori | Kompleksitet O notation Ordreforhold Sorter typer bæredygtige Indre Ekstern |
Udveksling | |
Valg | |
indsætter | |
fusion | |
Ingen sammenligninger | |
hybrid | |
Andet | |
upraktisk |