insertion sort java insertion sort algorithm examples
Tento výukový program vysvetľuje vkladanie, triedenie v Jave, vrátane jeho algoritmu, pseudokódu a príkladov radiacich polí, jednotlivo prepojených a dvojnásobne prepojených zoznamov:
Technika Algorithm Insertion Sort Algorithm je podobná Bubble sortu, ale je o niečo efektívnejšia. Triedenie vloženia je uskutočniteľnejšie a efektívnejšie, keď sa jedná o malý počet prvkov. Keď je množina údajov väčšia, zoradenie údajov bude trvať dlhšie.
=> Tu si pozrite príručku Java Beginners Guide.
aký je najlepší nástroj na odstránenie škodlivého softvéru
Čo sa dozviete:
Úvod do vkladania Zoradiť v jazyku Java
V technike Insertion sort predpokladáme, že prvý prvok v zozname je už zoradený a začíname druhým prvkom. Druhý prvok sa porovnáva s prvým a zamení sa, ak nie je v poriadku. Tento postup sa opakuje pre všetky nasledujúce prvky.
Všeobecne technika triedenia Vkladanie porovnáva každý prvok so všetkými jeho predchádzajúcimi prvkami a triedi prvok tak, aby sa umiestnil na správne miesto.
Ako už bolo spomenuté, technika triedenia vloženia je uskutočniteľnejšia pre menšiu množinu údajov, a preto možno polia s malým počtom prvkov triediť pomocou efektívneho triedenia vloženia.
Triedenie podľa vloženia je obzvlášť užitočné pri triedení dátových štruktúr prepojeného zoznamu. Ako viete, Prepojené zoznamy majú ukazovatele smerujúce na jeho nasledujúci prvok (jednotlivo prepojený zoznam) a predchádzajúci prvok (zoznam dvojitých odkazov). Takto je ľahšie sledovať predchádzajúci a nasledujúci prvok.
Preto je jednoduchšie použiť triedenie vloženia na triedenie prepojených zoznamov. Ak je údajových položiek viac, triedenie bude trvať veľa času.
V tomto výučbe sa budeme zaoberať technikou triedenia Insertion vrátane jej algoritmu, pseudokódu a príkladov. Budeme tiež implementovať programy Java na triedenie poľa, zoznam Singly linked a Doubly linked list pomocou triedenia Insertion.
Algoritmus zoradenia vloženia
Algoritmus triedenia vkladania je nasledovný.
Krok 1 : Opakujte kroky 2 až 5 pre K = 1 až N-1
Krok 2 : nastavená teplota = A [K]
Krok 3 : nastavenie J = K - 1
Krok 4 :
Opakujte, zatiaľ čo tepl<=A[J]
množina A [J + 1] = A [J]
množina J = J - 1
[koniec vnútornej slučky]
Krok 5 :
sada A [J + 1] = tepl
[koniec slučky]
Krok 6 : východ
Ako viete, triedenie vkladania začína od druhého prvku za predpokladu, že prvý prvok je už zoradený. Vyššie uvedené kroky sa opakujú pre všetky prvky v zozname od druhého prvku ďalej a na požadované miesta.
Pseudokód na triedenie vloženia
Pseudokód pre techniku triedenia vkladania je uvedený nižšie.
procedure insertionSort(array,N ) array – array to be sorted N- number of elements begin int freePosition int insert_val for i = 1 to N -1 do: insert_val = array[i] freePosition = i //locate free position to insert the element while freePosition > 0 and array[freePosition -1] > insert_val do: array [freePosition] = array [freePosition -1] freePosition = freePosition -1 end while //insert the number at free position array [freePosition] = insert_val end for end procedure
Ďalej si pozrime ilustráciu, ktorá demonštruje zoradenie poľa pomocou triedenia vloženia.
Triedenie poľa pomocou triedenia vloženia
Zoberme si príklad triedenia vloženia pomocou poľa.
Pole, ktoré sa má zoradiť, je nasledovné:
Teraz pre každý prechod porovnávame aktuálny prvok so všetkými jeho predchádzajúcimi prvkami. Takže pri prvom prechode začneme druhým prvkom.
Preto potrebujeme N počet prechodov na úplné triedenie poľa obsahujúceho N počet prvkov.
ako otvoriť súbor apk v telefóne s Androidom
Vyššie uvedenú ilustráciu je možné zhrnúť do tabuľky, ako je uvedené nižšie:
Prejdite | Netriedený zoznam | porovnanie | Zoradený zoznam |
---|---|---|---|
jeden | {10,2,6,15,4,1} | {10.2} | {2,10, 6,15,4,1} |
dva | {2,10, 6,15,4,1} | {2,10, 6} | {2,6,10,15,4,1} |
3 | {2,6,10,15,4,1} | {2.6, 10.15} | {2,6,10,15,4,1} |
4 | {2,6,10,15,4,1} | {2.6, 10.15.4} | {2,4,6,10,15,1} |
5 | {2,4,6,10,15,1} | {2,4,6,10,15,1} | {1,2,4,6, 10,15} |
6 | {} | {} | {1,2,4,6, 10,15} |
Ako je znázornené na ilustrácii vyššie, na konci každého prechodu sa jeden prvok umiestni na správne miesto. Všeobecne teda platí, že na umiestnenie N prvkov na ich správne miesto potrebujeme N-1 priechodov.
Implementácia triedenia vloženia v Jave
Nasledujúci program ukazuje implementáciu zoradenia Insertion v Jave. Tu máme pole, ktoré sa má triediť pomocou triedenia Vkladanie.
import java.util.*; public class Main { public static void main(String[] args) { //declare an array and print the original contents int[] numArray = {10,6,15,4,1,45}; System.out.println('Original Array:' + Arrays.toString(numArray)); //apply insertion sort algorithm on the array for(int k=1; k=0 && temp <= numArray[j]) { numArray[j+1] = numArray[j]; j = j-1; } numArray[j+1] = temp; } //print the sorted array System.out.println('Sorted Array:' + Arrays.toString(numArray)); } }
Výkon:
Originálne pole: [10, 6, 15, 4, 1, 45]
Zoradené pole: [1, 4, 6, 10, 15, 45]
Vo vyššie uvedenej implementácii je vidieť, že triedenie začína od 2ndprvok poľa (premenná slučky j = 1) a potom sa aktuálny prvok porovná so všetkými jeho predchádzajúcimi prvkami. Potom sa prvok umiestni do správnej polohy.
Triedenie vloženia funguje efektívne pre menšie polia a pre polia, ktoré sú čiastočne zoradené, kde je triedenie dokončené za menej prechodov.
Triedenie podľa vloženia je stabilné triedenie, t. J. Udržuje v zozname poradie rovnakých prvkov.
automatizované testovacie otázky a odpovede pre skúsených
Triedenie prepojeného zoznamu pomocou triedenia vloženia
Nasledujúci program Java zobrazuje triedenie jednotlivo prepojeného zoznamu pomocou zoradenia Insertion.
import java.util.*; class Linkedlist_sort { node head; node sorted; //define node of a linked list class node { int val; node next; public node(int val) { this.val = val; } } //add a node to the linked list void add(int val) { //allocate a new node node newNode = new node(val); //link new node to list newNode.next = head; //head points to new node head = newNode; } // sort a singly linked list using insertion sort void insertion_Sort(node headref) { // initially, no nodes in sorted list so its set to null sorted = null; node current = headref; // traverse the linked list and add sorted node to sorted list while (current != null) { // Store current.next in next node next = current.next; // current node goes in sorted list Insert_sorted(current); // now next becomes current current = next; } // update head to point to linked list head = sorted; } //insert a new node in sorted list void Insert_sorted(node newNode) { //for head node if (sorted == null || sorted.val >= newNode.val) { newNode.next = sorted; sorted = newNode; } else { node current = sorted; //find the node and then insert while (current.next != null && current.next.val Výkon:
Pôvodný prepojený zoznam:
1 8 32 2 10
Zoradený prepojený zoznam:
1 2 8 10 32
Vo vyššie uvedenom programe sme definovali triedu, ktorá vytvára prepojený zoznam a pridáva do neho uzly a tiež ich triedi. Pretože má jednotlivo prepojený zoznam ďalší ukazovateľ, je pri zoradení zoznamu ľahšie sledovať uzly.
Triedenie dvojnásobne prepojeného zoznamu pomocou triedenia podľa vloženia
Nasledujúci program zoraďuje dvojnásobne prepojený zoznam pomocou triedenia vloženia. Upozorňujeme, že keďže zoznam, ktorý má dvojnásobne prepojené odkazy, má predchádzajúci aj nasledujúci ukazovateľ, je ľahké pri triedení údajov tieto ukazovatele aktualizovať a opätovne prepojiť.
class Main { // doubly linked list node static class Node { int data; Node prev, next; }; // return a new node in DLL static Node getNode(int data){ //create new node Node newNode = new Node(); // assign data to node newNode.data = data; newNode.prev = newNode.next = null; return newNode; } // insert a node in sorted DLL static Node insert_Sorted(Node head_ref, Node newNode) { Node current; //list is empty if (head_ref == null) head_ref = newNode; // node is inserted at the beginning of the DLL else if ((head_ref).data >= newNode.data) { newNode.next = head_ref; newNode.next.prev = newNode; head_ref = newNode; } else { current = head_ref; // find the node after which new node is to be inserted while (current.next != null && current.next.data prev points to new node / if ((head_ref) != null) (head_ref).prev = newNode; // move the head to point to the new node / (head_ref) = newNode; return head_ref; } public static void main(String args[]) { // create empty DLL Node head = null; // add nodes to the DLL head=addNode(head, 5); head=addNode(head, 3); head=addNode(head, 7); head=addNode(head, 2); head=addNode(head, 11); head=addNode(head, 1); System.out.println( 'Original doubly linked list:'); print_DLL(head); head=insertion_Sort(head); System.out.println('
Sorted Doubly Linked List:'); print_DLL(head); } }
Výkon:
Pôvodný dvojnásobne prepojený zoznam:
1 11 2 7 3 5
Zoradený dvojnásobne prepojený zoznam:
1 2 3 5 7 11
často kladené otázky
Otázka 1) Čo je triedenie vloženia v Jave?
Odpoveď: Insertion sort je jednoduchá technika triedenia v Jave, ktorá je efektívna pre menší dátový súbor a na danom mieste. Predpokladá sa, že prvý prvok je vždy zoradený a potom je každý nasledujúci prvok porovnaný so všetkými svojimi predchádzajúcimi prvkami a umiestnený na správne miesto.
Otázka č. 2) Prečo je triedenie vloženia lepšie?
Odpoveď: Zoradenie vloženia je rýchlejšie pre menšie súbory údajov, keď ďalšie techniky, ako je rýchle triedenie, pridávajú réžiu prostredníctvom rekurzívnych hovorov. Triedenie vloženia je porovnateľne stabilnejšie ako iné algoritmy triedenia a vyžaduje menej pamäte. Insertion sort funguje tiež efektívnejšie, keď je pole takmer zoradené.
Otázka č. 3) Na čo sa používa triedenie vloženia?
Odpoveď: Triedenie vloženia sa väčšinou používa v počítačových aplikáciách, ktoré vytvárajú zložité programy, ako je vyhľadávanie súborov, hľadanie ciest a kompresia údajov.
Otázka č. 4)Aká je účinnosť zaradenia?
Odpoveď: Triedenie vloženia má priemerný výkon veľkých a malých písmen O (n ^ 2). Najlepší prípad pre vloženie zoradenia je, keď je pole už zoradené a je to O (n). Najhorší výkon pre triedenie vloženia je opäť O (n ^ 2).
Záver
Zoradenie podľa vloženia je jednoduchá technika triedenia, ktorá funguje na poliach alebo prepojených zoznamoch. Je to užitočné, keď je súbor údajov menší. S rozširovaním súboru údajov sa táto technika stáva pomalšou a neefektívnou.
Triedenie vloženia je tiež stabilnejšie a na mieste ako iné techniky triedenia. Neexistuje žiadna réžia pamäte, pretože sa na ukladanie triedených prvkov nepoužíva žiadna samostatná štruktúra.
Zoradenie vloženia funguje dobre pri triedení prepojených zoznamov, ktoré sú zoznammi jednotlivo aj dvojnásobne prepojenými. Je to tak preto, lebo prepojený zoznam je tvorený uzlami, ktoré sú spojené pomocou ukazovateľov. Preto je triedenie uzlov jednoduchšie.
V našom pripravovanom výučbe sa budeme zaoberať ešte ďalšou technikou triedenia v Jave.
=> Prečítajte si sériu Easy Java Training Series.
Odporúčané čítanie
- Výberové triedenie v Jave - Algoritmus a výberové triedenie výberu
- Zoradenie vloženia v C ++ s príkladmi
- Ako zoradiť pole v Jave - návod s príkladmi
- Metóda MongoDB Sort () s príkladmi
- Unixový príkaz na triedenie so syntaxou, možnosťami a príkladmi
- Shell zoradený v C ++ s príkladmi
- Príručka k rozhraniu Java a abstraktnej triede
- Výber Zoradiť v C ++ s príkladmi