introduction sorting techniques c
Seznam různých technik řazení v C ++.
Řazení je technika, která je implementována k uspořádání dat v určitém pořadí. Třídění je nutné, aby se zajistilo, že data, která používáme, jsou v určitém pořadí, abychom mohli snadno získat požadovanou informaci z hromady dat.
Pokud jsou data neudržovaná a netříděná, když chceme konkrétní informaci, pak ji budeme muset pro získání dat pokaždé prohledávat jeden po druhém.
=> Přečtěte si sérii školení Easy C ++.
Proto je vždy vhodné, abychom udržovali naše data uspořádaná v určitém pořadí, aby bylo možné snadno a efektivně provádět vyhledávání informací a další operace prováděné s daty.
Data ukládáme ve formě záznamů. Každý záznam je tvořen jedním nebo více poli. Když má každý záznam jedinečnou hodnotu konkrétního pole, nazýváme to klíčové pole. Například, ve třídě může být Roll No jedinečné nebo klíčové pole.
co je typ souboru bin
Data můžeme seřadit podle konkrétního pole klíče a poté je uspořádat vzestupně / vzestupně nebo sestupně / sestupně.
Podobně v telefonním slovníku se každý záznam skládá ze jména osoby, adresy a telefonního čísla. V tomto případě je telefonní číslo jedinečné nebo klíčové pole. Můžeme třídit data slovníku na tomto telefonním poli. Alternativně můžeme také třídit data buď číselně nebo alfanumericky.
Když můžeme upravit data, která se mají třídit v samotné hlavní paměti, aniž bychom potřebovali další pomocnou paměť, pak to nazýváme jako Interní třídění .
Na druhou stranu, když potřebujeme pomocnou paměť pro ukládání mezilehlých dat během třídění, pak voláme techniku jako Externí třídění .
V tomto kurzu se podrobně naučíme různé techniky řazení v C ++.
Co se naučíte:
Techniky řazení v C ++
C ++ podporuje různé techniky třídění, jak je uvedeno níže.
Řazení bublin
Třídění bublin je nejjednodušší technika, při které porovnáváme každý prvek s přilehlým prvkem a prvky vyměňujeme, pokud nejsou v pořádku. Tímto způsobem se na konci každé iterace (tzv. Pass) probublává nejtěžší prvek na konci seznamu.
Níže je uveden příklad třídění bublin.
Pole k třídění:
Jak je vidět výše, protože je to malé pole a bylo téměř tříděno, podařilo se nám během několika průchodů získat úplně seřazené pole.
Pojďme implementovat techniku Bubble Sort v C ++.
#include using namespace std; int main () { int i, j,temp; int a(5) = {10,2,0,43,12}; cout <<'Input list ...
'; for(i = 0; i<5; i++) { cout < Výstup:
Seznam vstupů…
10 2 0 43 12
Seznam seřazených prvků ...
0 2 10 12 43
Jak je vidět z výstupu, v technice třídění bublin je při každém průchodu nejtěžší prvek probubláván až na konec pole, čímž se pole kompletně třídí.
Výběr řazení
Je jednoduchá, ale snadno implementovatelná technika, ve které najdeme nejmenší prvek v seznamu a umístíme jej na správné místo. Při každém průchodu je vybrán další nejmenší prvek a umístěn do správné polohy.
Vezměme si stejné pole jako v předchozím příkladu a provedeme Selection Sort, abychom toto pole seřadili.
Jak je znázorněno na výše uvedeném obrázku, pro N počet prvků vezmeme N-1 průchody, abychom pole kompletně roztřídili. Na konci každého průchodu je nejmenší prvek v poli umístěn na správné pozici v seřazeném poli.
Dále pojďme implementovat Selection Sort pomocí C ++.
#include using namespace std; int findSmallest (int(),int); int main () { int myarray(5) = {12,45,8,15,33}; int pos,temp; cout<<'
Input list of elements to be Sorted
'; for(int i=0;i<5;i++) { cout< Výstup:
Vstupní seznam prvků, které mají být seřazeny
12 45 8 15 33
Seřazený seznam prvků je
8 12 15 33 45
Při třídění výběru je při každém průchodu nejmenší prvek v poli umístěn na správné místo. Proto na konci procesu třídění získáme kompletně seřazené pole.
Řazení vložení
Třídění vložení je technika, při které vycházíme z druhého prvku seznamu. Porovnáme druhý prvek s jeho předchozím (1Svatý) prvek a umístěte jej na správné místo. V dalším průchodu jej pro každý prvek porovnáme se všemi jeho předchozími prvky a vložíme tento prvek na správné místo.
Výše uvedené tři techniky třídění jsou jednoduché a snadno implementovatelné. Tyto techniky fungují dobře, když je velikost seznamu menší. Jak se seznam zvětšuje, tyto techniky neprovádějí tak efektivně.
Technika bude jasná po porozumění následující ilustraci.
Pole, které se má třídit, je následující:
Nyní pro každý průchod porovnáme aktuální prvek se všemi jeho předchozími prvky. Takže v prvním průchodu začneme s druhým prvkem.
Vyžadujeme tedy N počet průchodů, abychom kompletně roztřídili pole obsahující N počet prvků.
Pojďme implementovat techniku Insertion Sort pomocí C ++.
#include using namespace std; int main () { int myarray(5) = { 12,4,3,1,15}; cout<<'
Input list is
'; for(int i=0;i<5;i++) { cout < Výstup:
Seznam vstupů je
12 4 3 1 15
Řazený seznam je
1 3 4 12 15
Výše uvedený výstup ukazuje celé seřazené pole pomocí třídění vložení.
Rychlé třídění
Quicksort je nejúčinnější algoritmus, který lze použít k třídění dat. Tato technika využívá strategii „rozděl a panuj“, ve které je problém rozdělen na několik dílčích problémů a po vyřešení jsou tyto dílčí problémy jednotlivě sloučeny do úplného seřazeného seznamu.
V rychlém řazení nejprve rozdělíme seznam kolem otočného prvku a poté umístíme ostatní prvky do jejich správných pozic podle otočného prvku.
Jak je znázorněno na výše uvedeném obrázku, v technice Quicksort rozdělíme pole kolem otočného prvku tak, že všechny prvky menší než otočný čep jsou nalevo, z nichž větší než otočný čep jsou napravo. Pak tyto dvě pole nezávisle na sobě vezmeme a roztřídíme je a poté je spojíme nebo je dobijeme, abychom získali výsledné seřazené pole.
Klíčem k rychlému řazení je výběr otočného prvku. Může to být první, poslední nebo prostřední prvek pole. Prvním krokem po výběru prvku otočného čepu je umístění otočného čepu do správné polohy, abychom mohli pole vhodně rozdělit.
Implementujme techniku rychlého řazení pomocí C ++.
#include using namespace std; // Swap two elements - Utility function void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // partition the array using last element as pivot int partition (int arr(), int low, int high) { int i = (low - 1); for (int j = low; j <= high- 1; j++) { //if current element is smaller than pivot, increment the low element //swap elements at i and j if (arr(j) <= pivot) { i++; // increment index of smaller element swap(&arr(i), &arr(j)); } } swap(&arr(i + 1), &arr(high)); return (i + 1); } //quicksort algorithm void quickSort(int arr(), int low, int high) { if (low < high) { //partition the array int pivot = partition(arr, low, high); //sort the sub arrays independently quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } void displayArray(int arr(), int size) { int i; for (i=0; i < size; i++) cout< Výstup:
Vstupní pole
12 23 3 43 51
Pole seřazené pomocí Quicksort
3 12 23 43 51
V implementaci quicksort výše máme rutinu oddílů, která se používá k rozdělení vstupního pole kolem otočného prvku, který je posledním prvkem v poli. Potom rekurzivně zavoláme rutinu rychlého řazení, abychom jednotlivě setřídili dílčí pole, jak je znázorněno na obrázku.
Sloučit třídění
Toto je další technika, která využívá strategii „Rozděl a panuj“. V této technice nejdříve rozdělíme seznam na stejné poloviny. Pak na těchto seznamech provedeme nezávisle techniku sloučení, aby byly oba seznamy seřazeny. Nakonec oba seznamy sloučíme, abychom získali úplný seřazený seznam.
Sloučení a rychlé řazení jsou rychlejší než většina ostatních technik řazení. Jejich výkon zůstává nedotčen, i když se seznam zvětšuje.
Podívejme se na ilustraci techniky Merge Sort.
Na výše uvedeném obrázku vidíme, že technika sloučení sloučení rozděluje původní pole opakovaně do dílčích polí, dokud v každém dílčím poli není pouze jeden prvek. Jakmile to uděláte, dílčí sady se poté samostatně seřadí a sloučí dohromady, aby vytvořily kompletní seřazené pole.
Dále implementujme Sloučit řazení pomocí jazyka C ++.
#include using namespace std; void merge(int *,int, int , int ); void merge_sort(int *arr, int low, int high) { int mid; if (low num; cout<<'Enter '<myarray(i); } merge_sort(myarray, 0, num-1); cout<<'Sorted array
'; for (int i = 0; i < num; i++) { cout< Výstup:
Zadejte počet prvků k seřazení: 5
Zadejte 5 prvků k seřazení: 10 21 47 3 59
Seřazené pole
3 10 21 47 59
Shell Sort
Shell sort je rozšíření techniky vkládání řazení. V Insertion sort se zabýváme pouze dalším prvkem, zatímco v shellu poskytujeme přírůstek nebo mezeru, pomocí které vytváříme menší seznamy z nadřazeného seznamu. Prvky v podseznamech nemusí být souvislé, spíše jsou obvykle odděleny „gap_value“.
Třídění prostředí funguje rychleji než řazení Insertion a vyžaduje méně tahů než řazení Insertion.
Pokud poskytneme mezeru, pak budeme mít následující dílčí seznamy s každým prvkem, který je od sebe vzdálený 3 prvky.
Tyto tři podseznamy potom roztřídíme.
Výše uvedené pole, které jsme získali po sloučení seřazených dílčích polí, je téměř tříděno. Nyní můžeme provést třídění vložení na tomto poli a seřadit celé pole.
Vidíme tedy, že jakmile rozdělíme pole na podlisty pomocí příslušného přírůstku a poté je spojíme dohromady, získáme téměř seřazený seznam. Lze provést techniku třídění vložení v tomto seznamu a pole je tříděno v menším počtu tahů než původní řazení.
Níže je uvedena implementace Shell Sort v C ++.
#include using namespace std; // shellsort implementation int shellSort(int arr(), int N) { for (int gap = N/2; gap > 0; gap /= 2) { for (int i = gap; i = gap && arr(j - gap) > temp; j -= gap) arr(j) = arr(j - gap); arr(j) = temp; } } return 0; } int main() { int arr() = {45,23,53,43,18}; //Calculate size of array int N = sizeof(arr)/sizeof(arr(0)); cout << 'Array to be sorted:
'; for (int i=0; i Výstup:
Pole k třídění:
45 23 53 43 18
Pole po třídění skořápky:
18 23 43 45 53
Shell sort tedy funguje jako obrovské vylepšení oproti druhům vkládání a netřídí pole ani polovinou počtu kroků.
Třídění haldy
Heapsort je technika, při které se k seřazení seznamu používá datová struktura haldy (min. Halda nebo max. Halda). Nejprve vytvoříme haldu z netříděného seznamu a také použijeme haldu k seřazení pole.
Heapsort je efektivní, ale ne tak rychlý nebo sloučení.
Jak je znázorněno na výše uvedeném obrázku, nejprve sestavíme maximální hromadu z prvků pole, které se mají třídit. Pak přejdeme haldu a zaměníme poslední a první prvek. V tuto chvíli je poslední prvek již seřazen. Potom ze zbývajících prvků znovu sestavíme maximální hromadu.
Opět projděte haldu a vyměňte první a poslední prvek a přidejte poslední prvek do seřazeného seznamu. Tento proces pokračuje, dokud v haldě nezbude jen jeden prvek, který se stane prvním prvkem seřazeného seznamu.
Pojďme nyní implementovat Heap Sort pomocí C ++.
#include using namespace std; // function to heapify the tree void heapify(int arr(), int n, int root) { int largest = root; // root is the largest element int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { //swap root and largest swap(arr(root), arr(largest)); // Recursively heapify the sub-tree heapify(arr, n, largest); } } // implementing heap sort void heapSort(int arr(), int n) { // build heap for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // extracting elements from heap one by one for (int i=n-1; i>=0; i--) { // Move current root to end swap(arr(0), arr(i)); // again call max heapify on the reduced heap heapify(arr, i, 0); } } /* print contents of array - utility function */ void displayArray(int arr(), int n) { for (int i=0; i Výstup:
Vstupní pole
4 17 3 12 9
Seřazené pole
3 4 9 12 17
Zatím jsme stručně probrali všechny hlavní techniky třídění s ilustrací. Každou z těchto technik se naučíme podrobně v našich dalších cvičeních spolu s různými příklady, jak každé technice porozumět.
Závěr
Řazení je nutné, aby byla data tříděna a ve správném pořadí. Nezařazené a neudržované může přístup trvat déle, a tak může zasáhnout výkon celého programu. U všech operací souvisejících s daty, jako je přístup, vyhledávání, manipulace atd., Tedy potřebujeme data třídit.
V programování se používá mnoho třídicích technik. Každá technika může být použita v závislosti na datové struktuře, kterou používáme, nebo na čase, který algoritmus potřebuje k seřazení dat nebo paměťového prostoru, který algoritmus zařídil k seřazení dat. Technika, kterou používáme, závisí také na tom, jakou datovou strukturu třídíme.
Techniky řazení nám umožňují třídit naše datové struktury v určitém pořadí a uspořádat prvky buď vzestupně, nebo sestupně. Viděli jsme techniky třídění jako Bubble sort, Selection sort, Insertion sort, Quicksort, Shell sort, Merge sort a Heap sort. Třídění bublin a třídění podle výběru jsou jednodušší a snáze implementovatelné.
V našich následujících výukových programech uvidíme každou z výše uvedených technik řazení podrobně.
=> Klikněte sem a získejte bezplatný kurz C ++.
Doporučené čtení
- Třídění haldy v C ++ s příklady
- Sloučit řazení v C ++ s příklady
- Řazení vložení v C ++ s příklady
- JMeter Video 1: Úvod, stahování a instalace JMeteru
- Úvod do programovacího jazyka Java - výukový program
- Proces zavedení a instalace Pythonu
- Unixový příkaz pro řazení se syntaxí, možnostmi a příklady
- Metoda MongoDB Sort () s příklady