Algoritm de sortare inserare în Java cu Exemplu de program

⚡ Rezumat inteligent

Sortare prin inserare în Java construiește o secțiune sortată a unui tablou element cu element, deplasând valorile mai mari la dreapta până când fiecare cheie ajunge în poziția corectă, ceea ce o face ideală pentru seturi de date mici.

  • 🔘 Definiție: Sortarea prin inserție elimină un element și îl inserează în locul său corect în porțiunea sortată.
  • ☑️ Procesul: Fiecare trecere compară cheia cu valorile anterioare și le deplasează pe cele mai mari cu o poziție la dreapta.
  • Program: Java Exemplul sortează {860, 8, 200, 9} și afișează fiecare comparație și schimb.
  • 🧪 Complexitate: Cel mai bun caz se desfășoară în timp O(n), în timp ce cazurile medii și cele mai rele ajung la O(n²).
  • 🛠️ Memorie: Sortarea are loc pe loc, deci spațiul auxiliar rămâne la O(1) pentru orice dimensiune a matricei.
  • 📊 Comportament: Algoritmul este stabil și adaptiv, astfel încât tablourile aproape sortate se termină după foarte puține deplasări.

Algoritm de sortare inserare în Java

Ce este algoritmul de sortare prin inserție?

Sortarea prin inserție este un algoritm de sortare simplu, potrivit pentru seturi mici de date. În timpul fiecărei iterații, algoritmul:

  • Îndepărtează un element dintr-o matrice.
  • O compară cu cea mai mare valoare din mulțime.
  • Mută ​​elementul în locația corectă.

Comportamentul reflectă modul în care un jucător de cărți își aranjează mâna: fiecare carte nouă este ridicată și împinsă la stânga, trecând pe lângă fiecare carte mai mare, până când se oprește în locul potrivit. Deoarece toate deplasările au loc în interiorul matricei originale, sortarea prin inserție este atât in-place (pe loc), cât și stabilă.

Aparține aceleiași familii de articole prietenoase pentru începători Java rutine de sortare ca sortare cu bule, totuși, în mod normal, efectuează mult mai puține scrieri asupra datelor care sunt deja parțial ordonate.

Procesul algoritmului de sortare prin inserare

Iată cum funcționează grafic procesul algoritmului de sortare prin inserare:

Animat trace al algoritmului de sortare prin inserție care reordonează o listă nesortată
Procesul algoritmului de sortare prin inserare

Animația repetă aceiași trei pași Java se efectuează programul de mai jos. Tabelul de simulare tracafișează acei pași pe matricea eșantion {860, 8, 200, 9}, exact așa cum programul îi afișează la momentul execuției.

Trece Element cheie Comparații făcute Matrice după trecere
1 8 8 contra 860 +8 860 200 9
2 200 200 contra 860 +8 200 860 9
3 9 9 împotriva 860, apoi 9 împotriva 200 +8 9 200 860

Observați că trecerea 3 necesită două comparații deoarece cheia 9 trebuie să treacă de două valori mai mari. Prin urmare, numărul de comparații crește odată cu cât de departe de ordine începe fiecare element.

Java Exemplu de program pentru a sorta o matrice folosind algoritmul de sortare prin inserție:

Programul de mai jos sortează tabloul {860, 8, 200, 9} și afișează un comentariu continuu, astfel încât fiecare comparație și fiecare deplasare să fie vizibilă. Salvați-l ca InsertionSortExample.java și compilați-l cu orice JDK 8 sau o versiune ulterioară.

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();
	    
	}
}

Rularea clasei produce trace prezentat aici. Fiecare Sortare număr permis Linia marchează o iterație a buclei exterioare, iar linia imprimată după fiecare schimbare arată matricea așa cum se prezintă în acel moment.

Code ieșire:

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

Complexitatea timpului și spațiului sortării prin inserție

Performanța sortării prin inserție depinde în mare măsură de cât de ordonată este deja intrarea, motiv pentru care cel mai bun caz și cel mai rău caz diferă printr-un întreg ordin de creștere.

Caz Condiție de intrare Complexitatea timpului
Cel mai bune Matricea este deja sortată, deci bucla interioară while nu rulează niciodată O (n)
In medie Elementele sosesc în ordine aleatorie O(n²)
Mini rulouri de absorbție Matricea este sortată invers, astfel încât fiecare cheie ajunge în față O(n²)

Utilizarea spațiului este mult mai simplă. Doar contoarele i, j, n și key sunt create, iar matricea este rearanjată la locul ei, deci spațiul auxiliar este O(1) indiferent de cât de mare crește intrarea.

Deoarece bucla interioară se oprește imediat ce întâlnește o valoare mai mică, sortarea prin inserție este descrisă ca adaptivă: cu cât intrarea este mai aproape de ordinea sortată, cu atât timpul de execuție se apropie mai mult de liniar.

Avantajele și dezavantajele sortării prin inserție

Sortarea prin inserție supraviețuiește în bibliotecile de producție în ciuda cazului său mediu pătratic, deoarece factorii săi constanți sunt mici, iar comportamentul său este previzibil.

Avantaje

  • Simplu de scris și ușor de trace de mână, ceea ce îl potrivește atât predării, cât și interviurilor.
  • Stabil, astfel încât înregistrările care partajează o cheie își păstrează ordinea relativă originală.
  • In situ, necesitând doar O(1) memorie suplimentară dincolo de matricea de intrare.
  • Adaptiv, ajungând la O(n) pe date care sunt deja aproape sortate.
  • Online, adică poate sorta o listă în timp ce elemente noi încă sosesc.

Dezavantaje

  • Timpul pătratic pe intrări aleatorii sau ordonate invers îl face nepotrivit pentru matricele mari.
  • Fiecare deplasare scrie în matrice, deci mută mai multe date decât o face sortarea prin selecție.
  • Sortarea prin îmbinare și sortarea rapidă o depășesc confortabil odată ce intrarea trece prin câteva zeci de elemente.

O regulă practică este să se apeleze la sortarea prin inserție atunci când matricea este mică, când datele sunt aproape în ordine sau când o sortare de tip împărțire și cucerire a redus o partiție la o mână de elemente.

Sortare prin inserție vs. BubblSortare e vs. sortare prin selecție

Toți cei trei algoritmi sunt sortări prin comparație pătratică, însă diferă în ceea ce privește stabilitatea, modul în care reacționează la intrările ordonate și numărul de scrieri pe care le efectuează.

Criterii Sortare prin inserție Bubble Sortare Selecție Sortare
Cel mai bun caz O (n) O(n) cu un indicator de ieșire timpurie O(n²)
Caz mediu și cel mai rău O(n²) O(n²) O(n²)
Spațiu suplimentar O (1) O (1) O (1)
Stabil Da Da Nu, în versiunea standard a matricei
Adaptive Da Da, când se utilizează optimizarea steagului Nu
Scrie în matrice Multe schimbări, puține pe date ordonate Multe schimburi Exact n-1 schimburi

Sortarea prin selecție câștigă atunci când o scriere este costisitoare, deoarece efectuează cele mai puține schimbări. Sortarea prin inserție câștigă aproape oriunde altundeva la această scară, în special pe date parțial ordonate, motiv pentru care sortările de bibliotecă, cum ar fi cea din spatele comun Java Exerciții iar componentele interne ale JDK-ului trec la acesta pentru partiții foarte mici.

Întrebări frecvente

Primul element în sine este deja un sub-matrice sortat de lungime unu. Începând de la indexul 1 înseamnă că bucla are întotdeauna ceva cu care să se compare, așadar cheia de la poziția i este inserată în blocul ordonat din stânga sa.

Asistenții inteligenți artificiali pot nara o simulare linie cu linie, pot genera tablouri de testare suplimentare și pot estima creșterea Big O din codul sursă. Tratați explicația ca pe un ajutor pentru studiu și confirmați afirmațiile de complexitate în raport cu un manual înainte de a le cita.

Da. Copilotul GitHub finalizează o sortare standard prin inserție dintr-o semnătură de metodă sau un comentariu. RevVizualizați singur condițiile la limită, deoarece buclele generate folosesc uneori j >= 0 sau j > -1 în mod inconsistent cu codul înconjurător.

Sortarea binară prin inserție localizează punctul de inserție cu o căutare binară în loc de o scanare liniară, reducând comparațiile per element de la O(n) la O(log n). Lucrul mecanic de deplasare rămâne neschimbat, deci complexitatea totală în timp rămâne O(n²).

Da. O versiune recursivă sortează primele n-1 elemente, apoi inserează ultimul element în prefixul sortat. Corespunde complexității temporale iterative, dar adaugă O(n) spațiu de stivă, deci versiunea cu buclă este preferată în practică.

Parțial. Sortarea rapidă cu dual-pivot utilizată pentru primitive se bazează pe o sortare de tip inserție pe partiții foarte mici, iar TimSort, utilizat pentru obiecte, sortează secțiunile scurte cu sortare binară prin inserție înainte de a le îmbina.

Erorile frecvente sunt pornirea buclei exterioare de la 0, scrierea lui arr[j] = key în loc de arr[j+1] = key și omiterea gardăi j > -1, care generează o excepție ArrayIndexOutOfBoundsException atunci când cheia aparține poziției zero.

Da. Înlocuiți testul „mai mare decât” cu compareTo pentru un tip Comparable sau cu un apel Comparator. Logica de deplasare rămâne neschimbată, iar stabilitatea este păstrată, ceea ce este important atunci când obiectele au aceeași cheie de sortare.

Rezumați această postare cu: