logo

Třídění vkládání – Výukové programy pro strukturu dat a algoritmy

Řazení vložení je jednoduchý třídicí algoritmus, který funguje tak, že každý prvek neseřazeného seznamu se iterativně vkládá na správné místo v seřazené části seznamu. Je to a stabilní třídění algoritmu, což znamená, že prvky se stejnými hodnotami si zachovávají své relativní pořadí v seřazeném výstupu.

Řazení vložení je jako třídit hrací karty v rukou. Karty rozdělíte do dvou skupin: setříděné karty a netříděné karty. Poté vyberete kartu z netříděné skupiny a vložíte ji na správné místo v seřazené skupině.



Algoritmus řazení vložení:

Řazení vložení je jednoduchý třídicí algoritmus, který funguje tak, že vytváří setříděné pole jeden prvek po druhém. Je považováno za na místě třídicí algoritmus, což znamená, že nevyžaduje žádný další paměťový prostor nad rámec původního pole.

tygr ve srovnání se lvem

Algoritmus:

Chcete-li dosáhnout řazení vložení, postupujte takto:



  • Musíme začít s druhým prvkem pole, protože se předpokládá, že první prvek v poli je seřazený.
  • Porovnejte druhý prvek s prvním prvkem a zkontrolujte, zda je druhý prvek menší, pak je vyměňte.
  • Přejděte na třetí prvek a porovnejte jej s druhým prvkem, poté s prvním prvkem a podle potřeby jej vyměňte, abyste jej umístili na správnou pozici mezi prvními třemi prvky.
  • Pokračujte v tomto procesu, porovnejte každý prvek s těmi před ním a podle potřeby prohoďte, abyste jej umístili na správnou pozici mezi seřazené prvky.
  • Opakujte, dokud není celé pole seřazeno.

Fungování algoritmu řazení vložení:

Zvažte pole s prvky : {23, 1, 10, 5, 2}

První průchod:



  • Aktuální prvek je 23
  • Předpokládá se, že první prvek v poli je seřazený.
  • Seřazená část až 0 index je: [23]

Druhý průchod:

  • Porovnejte 1 s 23 (aktuální prvek s seřazenou částí).
  • Od té doby 1 je menší, vlož 1 před 23 .
  • Seřazená část až 1 index je: [1, 23]

Třetí průchod:

java core java
  • Porovnejte 10 s 1 a 23 (aktuální prvek s seřazenou částí).
  • Od té doby 10 je větší než 1 a menší než 23 , vložit 10 mezi 1 a 23 .
  • Seřazená část až 2 index je: [1, 10, 23]

Čtvrtý průchod:

  • Porovnejte 5 s 1 , 10 , a 23 (aktuální prvek s seřazenou částí).
  • Od té doby 5 je větší než 1 a menší než 10 , vložit 5 mezi 1 a 10 .
  • Seřazená část až 3 index je : [1, 5, 10, 23]

Pátý průchod:

  • Porovnejte 2 s 1, 5, 10 , a 23 (aktuální prvek s seřazenou částí).
  • Od té doby 2 je větší než 1 a menší než 5 vložit 2 mezi 1 a 5 .
  • Seřazená část až 4 index je: [1, 2, 5, 10, 23]

Konečné pole:

  • Seřazené pole je: [1, 2, 5, 10, 23]
Doporučený postup Vkládání Řadit Vyzkoušejte!

Implementace řazení vložení:

C++
// C++ program for insertion sort #include  using namespace std; // Function to sort an array using // insertion sort void insertionSort(int arr[], int n) {  int i, key, j;  for (i = 1; i < n; i++) {  key = arr[i];  j = i - 1;  // Move elements of arr[0..i-1],  // that are greater than key,   // to one position ahead of their  // current position  while (j>= 0 && arr[j]> klíč) { arr[j + 1] = arr[j];  j = j-1;  } arr[j + 1] = klíč;  } } // Obslužná funkce pro tisk pole // velikosti n void printArray(int arr[], int n) { int i;  pro (i = 0; i< n; i++)  cout << arr[i] << ' ';  cout << endl; } // Driver code int main() {  int arr[] = { 12, 11, 13, 5, 6 };  int N = sizeof(arr) / sizeof(arr[0]);  insertionSort(arr, N);  printArray(arr, N);  return 0; } // This is code is contributed by rathbhupendra>
C
// C program for insertion sort #include  #include  /* Function to sort an array using insertion sort*/ void insertionSort(int arr[], int n) {  int i, key, j;  for (i = 1; i < n; i++) {  key = arr[i];  j = i - 1;  /* Move elements of arr[0..i-1], that are  greater than key, to one position ahead  of their current position */  while (j>= 0 && arr[j]> klíč) { arr[j + 1] = arr[j];  j = j-1;  } arr[j + 1] = klíč;  } } // Obslužná funkce pro tisk pole o velikosti n void printArray(int arr[], int n) { int i;  pro (i = 0; i< n; i++)  printf('%d ', arr[i]);  printf('
'); } /* Driver program to test insertion sort */ int main() {  int arr[] = { 12, 11, 13, 5, 6 };  int n = sizeof(arr) / sizeof(arr[0]);  insertionSort(arr, n);  printArray(arr, n);  return 0; }>
Jáva
// Java program for implementation of Insertion Sort public class InsertionSort {  /*Function to sort array using insertion sort*/  void sort(int arr[])  {  int n = arr.length;  for (int i = 1; i < n; ++i) {  int key = arr[i];  int j = i - 1;  /* Move elements of arr[0..i-1], that are  greater than key, to one position ahead  of their current position */  while (j>= 0 && arr[j]> klíč) { arr[j + 1] = arr[j];  j = j-1;  } arr[j + 1] = klíč;  } } /* Obslužná funkce pro tisk pole o velikosti n*/ static void printArray(int arr[]) { int n = arr.length;  for (int i = 0; i< n; ++i)  System.out.print(arr[i] + ' ');  System.out.println();  }  // Driver method  public static void main(String args[])  {  int arr[] = { 12, 11, 13, 5, 6 };  InsertionSort ob = new InsertionSort();  ob.sort(arr);  printArray(arr);  } }; /* This code is contributed by Rajat Mishra. */>
Krajta
# Python program for implementation of Insertion Sort # Function to do insertion sort def insertionSort(arr): # Traverse through 1 to len(arr) for i in range(1, len(arr)): key = arr[i] # Move elements of arr[0..i-1], that are # greater than key, to one position ahead # of their current position j = i-1 while j>= 0 a klíč< arr[j] : arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key # Driver code to test above arr = [12, 11, 13, 5, 6] insertionSort(arr) for i in range(len(arr)): print ('% d' % arr[i]) # This code is contributed by Mohit Kumra>
C#
// C# program for implementation of Insertion Sort using System; class InsertionSort {  // Function to sort array  // using insertion sort  void sort(int[] arr)  {  int n = arr.Length;  for (int i = 1; i < n; ++i) {  int key = arr[i];  int j = i - 1;  // Move elements of arr[0..i-1],  // that are greater than key,  // to one position ahead of  // their current position  while (j>= 0 && arr[j]> klíč) { arr[j + 1] = arr[j];  j = j-1;  } arr[j + 1] = klíč;  } } // Obslužná funkce pro tisk // pole o velikosti n static void printArray(int[] arr) { int n = arr.Length;  for (int i = 0; i< n; ++i)  Console.Write(arr[i] + ' ');  Console.Write('
');  }  // Driver Code  public static void Main()  {  int[] arr = { 12, 11, 13, 5, 6 };  InsertionSort ob = new InsertionSort();  ob.sort(arr);  printArray(arr);  } } // This code is contributed by ChitraNayal.>
Javascript
>
PHP
 // PHP program for insertion sort // Function to sort an array // using insertion sort function insertionSort(&$arr, $n) { for ($i = 1; $i < $n; $i++) { $key = $arr[$i]; $j = $i-1; // Move elements of arr[0..i-1], // that are greater than key, to  // one position ahead of their  // current position while ($j>= 0 && $arr[$j]> $klíč) { $arr[$j + 1] = $arr[$j]; $j = $j - 1; } $arr[$j + 1] = $klíč; } } // Obslužná funkce pro // tisk pole o velikosti n funkce printArray(&$arr, $n) { for ($i = 0; $i< $n; $i++) echo $arr[$i].' '; echo '
'; } // Driver Code $arr = array(12, 11, 13, 5, 6); $n = sizeof($arr); insertionSort($arr, $n); printArray($arr, $n); // This code is contributed by ChitraNayal. ?>>

Výstup
5 6 11 12 13>

Časová náročnost: O(N^2)
Pomocný prostor: O(1)

Analýza složitosti řazení vložení :

Časová složitost řazení vložení

  • Nejlepší případ: Na) , Pokud je seznam již seřazen, kde n je počet prvků v seznamu.
  • Průměrný případ: Na 2 ) , Pokud je seznam náhodně uspořádán
  • Nejhorší případ: Na 2 ) , Pokud je seznam v opačném pořadí

Vesmírná složitost řazení vložení

  • Pomocný prostor: O(1), vyžaduje řazení vložení O(1) další prostor, což z něj dělá prostorově efektivní třídicí algoritmus.

Výhody řazení vložení:

  • Jednoduché a snadno implementovatelné.
  • Stabilní třídicí algoritmus.
  • Efektivní pro malé seznamy a téměř seřazené seznamy.
  • Prostorově efektivní.

Nevýhody řazení vložení:

  • Neefektivní pro velké seznamy.
  • Ve většině případů nejsou tak účinné jako jiné třídicí algoritmy (např. slučovací třídění, rychlé třídění).

Aplikace řazení vložení:

Řazení vložení se běžně používá v situacích, kdy:

  • Seznam je malý nebo téměř seřazený.
  • Důležitá je jednoduchost a stabilita.

Často kladené otázky o řazení vkládání

Q1. Jaké jsou hraniční případy algoritmu řazení vložení?

velbloudí krajta

Třídění vložení trvá seřazení maximálně času, pokud jsou prvky seřazeny v opačném pořadí. A trvá to minimální čas (Řád n), když jsou prvky již seřazeny.

Q2. Co je algoritmické paradigma algoritmu řazení vložení?

Algoritmus řazení vložení sleduje inkrementální přístup.

slučovací druh

Q3. Je vkládání třídicí algoritmus na místě?

Ano, řazení vložení je algoritmus řazení na místě.

Q4. Je řazení vložení stabilním algoritmem?

Ano, řazení vložení je stabilní algoritmus řazení.

Q5. Kdy se používá algoritmus řazení vložení?

Třídění vložení se používá, když je počet prvků malý. Může být také užitečné, když je vstupní pole téměř seřazeno a pouze několik prvků je špatně umístěno v kompletním velkém poli.