Insertion Sort Algoritm in Java med programexempel
โก Smart sammanfattning
Insรคttningssortering i Java bygger en sorterad del av en array, ett element i taget, och flyttar stรถrre vรคrden รฅt hรถger tills varje nyckel landar pรฅ sin rรคtta position, vilket gรถr den idealisk fรถr smรฅ datamรคngder.
Vad รคr Insertion Sort Algorithm?
Insรคttningssortering รคr en enkel sorteringsalgoritm som lรคmpar sig fรถr smรฅ datamรคngder. Under varje iteration, algoritmen:
- Tar bort ett element frรฅn en array.
- Jรคmfรถr det mot det stรถrsta vรคrdet i array.
- Flyttar elementet till rรคtt plats.
Beteendet speglar hur en kortspelare arrangerar en hand: varje nytt kort plockas upp och skjuts รฅt vรคnster fรถrbi varje stรถrre kort tills det vilar pรฅ rรคtt plats. Eftersom all fรถrskjutning sker inuti den ursprungliga matrisen รคr insรคttningssortering bรฅde pรฅ plats och stabil.
Den tillhรถr samma familj av nybรถrjarvรคnliga Java sorteringsrutiner som bubbelsorter, men den utfรถr normalt betydligt fรคrre skrivningar pรฅ data som redan รคr delvis ordnad.
Insรคttningssorteringsalgoritmprocess
Sรฅ hรคr fungerar sorteringsalgoritmen fรถr infogning grafiskt:

Animationen upprepar samma tre steg Java Programmet nedan utfรถrs. Torrkรถrningstabellen tracutfรถr dessa steg pรฅ exempelmatrisen {860, 8, 200, 9}, exakt som programmet skriver ut dem vid kรถrning.
| Pass | Nyckelelement | Jรคmfรถrelser gjorda | Matris efter passet |
|---|---|---|---|
| 1 | 8 | 8 mot 860 | 8 860 200 9 |
| 2 | 200 | 200 mot 860 | 8 200 860 9 |
| 3 | 9 | 9 mot 860, sedan 9 mot 200 | 8 9 200 860 |
Observera att pass 3 behรถver tvรฅ jรคmfรถrelser eftersom tangent 9 mรฅste passera tvรฅ stรถrre vรคrden. Antalet jรคmfรถrelser รถkar dรคrfรถr med hur lรฅngt ur ordning varje element bรถrjar.
Java Programexempel fรถr att sortera en matris med Insertion Sort Algorithm:
Programmet nedan sorterar arrayen {860, 8, 200, 9} och skriver ut en lรถpande kommentar, sรฅ varje jรคmfรถrelse och varje fรถrskjutning รคr synlig. Spara den som InsertionSortExample.java och kompilera den med valfri JDK 8 eller senare version.
package com.guru99; public class InsertionSortExample { public static void main(String a[]) { int[] myArray = {860,8,200,9}; System.out.println("Before Insertion Sort"); printArray(myArray); insertionSort(myArray);//sorting array using insertion sort System.out.println("After Insertion Sort"); printArray(myArray); } public static void insertionSort(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { System.out.println("Sort Pass Number "+(i)); int key = arr[i]; int j = i-1; while ( (j > -1) && ( arr [j] > key ) ) { System.out.println("Comparing "+ key + " and " + arr [j]); arr [j+1] = arr [j]; j--; } arr[j+1] = key; System.out.println("Swapping Elements: New Array After Swap"); printArray(arr); } } static void printArray(int[] array){ for(int i=0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); } }
Att hรฅlla klassen producerar tracvisas hรคr. Varje Sorteringspassnummer linjen markerar en iteration av den yttre loopen, och linjen som skrivs ut efter varje byte visar arrayen som den ser ut just dรฅ.
Code Produktion:
Before Insertion Sort 860 8 200 9 Sort Pass Number 1 Comparing 8 and 860 Swapping Elements: New Array After Swap 8 860 200 9 Sort Pass Number 2 Comparing 200 and 860 Swapping Elements: New Array After Swap 8 200 860 9 Sort Pass Number 3 Comparing 9 and 860 Comparing 9 and 200 Swapping Elements: New Array After Swap 8 9 200 860 After Insertion Sort 8 9 200 860
Tids- och rumskomplexitet fรถr insรคttningssortering
Prestandan fรถr insรคttningssortering beror starkt pรฅ hur ordnad inmatningen redan รคr, vilket รคr anledningen till att det bรคsta fallet och det vรคrsta fallet skiljer sig รฅt med en hel ordningsstorlek.
| Case | Inmatningsvillkor | Tidskomplexitet |
|---|---|---|
| Bรคst | Arrayen รคr redan sorterad, sรฅ den inre while-loopen kรถrs aldrig | O (n) |
| Genomsnitt | Elementen anlรคnder i slumpmรคssig ordning | O(nยฒ) |
| vรคrsta | Matrisen sorteras i omvรคnd ordning, sรฅ varje tangent hamnar lรคngst fram | O(nยฒ) |
Utrymmesutnyttjandet รคr mycket enklare. Endast rรคknarna i, j, n och key skapas och arrayen omorganiseras pรฅ plats, sรฅ hjรคlputrymmet รคr O(1) oavsett hur stor inmatningen vรคxer.
Eftersom den inre loopen stannar sรฅ snart den mรถter ett mindre vรคrde beskrivs insรคttningssortering som adaptiv: ju nรคrmare ingรฅngen รคr sorterad ordning, desto nรคrmare rรถr sig kรถrtiden linjรคr.
Fรถrdelar och nackdelar med insรคttningssortering
Insรคttningssortering รถverlever i produktionsbibliotek trots sitt kvadratiska medelvรคrde, eftersom dess konstanta faktorer รคr smรฅ och dess beteende รคr fรถrutsรคgbart.
Fรถrdelar
- Enkel att skriva och lรคtt att trace fรถr hand, vilket passar fรถr undervisning och intervjuer.
- Stabil, sรฅ poster som delar en nyckel behรฅller sin ursprungliga relativa ordning.
- Pรฅ plats, behรถver endast O(1) extra minne utรถver inmatningsmatrisen.
- Adaptiv, nรฅr O(n) pรฅ data som redan รคr nรคstan sorterad.
- Online, vilket betyder att den kan sortera en lista medan nya element fortfarande anlรคnder.
Nackdelar
- Kvadratisk tid pรฅ slumpmรคssig eller omvรคnd ordning i inmatningen gรถr den olรคmplig fรถr stora matriser.
- Varje skift skriver till arrayen, sรฅ den flyttar mer data รคn vad urvalssortering gรถr.
- Merge sortering och quicksort รถvertrรคffar det bekvรคmt nรคr inmatningen passerar nรฅgra dussin element.
En praktisk regel รคr att anvรคnda insรคttningssortering nรคr arrayen รคr liten, nรคr data nรคstan รคr i ordning, eller nรคr en dela-och-hรคrska-sortering har reducerat en partition till en handfull element.
Insรคttningssortering vs. Bubble-sortering kontra urvalssortering
Alla tre algoritmerna รคr kvadratiska jรคmfรถrelsetyper, men de skiljer sig รฅt i stabilitet, i hur de reagerar pรฅ ordnad inmatning och i antalet skrivningar de utfรถr.
| Kriterier | Insรคttningssortering | Bubble Sortera | Urvalssortering |
|---|---|---|---|
| Bรคsta fall | O (n) | O(n) med en flagga fรถr tidig utgรฅng | O(nยฒ) |
| Genomsnitt och vรคrsta tรคnkbara scenario | O(nยฒ) | O(nยฒ) | O(nยฒ) |
| Extra utrymme | O (1) | O (1) | O (1) |
| Stabil | Ja | Ja | Nej, i standardversionen av arrayen |
| Adaptiv | Ja | Ja, nรคr flaggoptimering anvรคnds | Nej |
| Skriver till arrayen | Mรฅnga skift, fรฅ pรฅ bestรคlld data | Mรฅnga byten | Exakt n-1 byten |
Urvalssortering vinner nรคr en skrivning รคr dyr, eftersom den utfรถr minst antal byten. Insรคttningssortering vinner nรคstan รถverallt annars i denna skala, sรคrskilt pรฅ delvis ordnad data, vilket รคr anledningen till att bibliotekssorteringar som den bakom gemensam Java รถvningar och JDK-internationerna vรคxlar till det fรถr mycket smรฅ partitioner.
