merge sort c with examples
C ++ Technika sortowania przez scalanie.
Algorytm sortowania przez scalanie wykorzystuje „ dziel i rządź ”, W której dzielimy problem na podproblemy i rozwiązujemy je indywidualnie.
Te podproblemy są następnie łączone lub scalane razem w celu utworzenia ujednoliconego rozwiązania.
=> Przeczytaj popularne serie szkoleń C ++ tutaj.
Czego się nauczysz:
pliki swf nie są odtwarzane w przeglądarce
- Przegląd
- Algorytm ogólny
- Pseudokod do sortowania przez scalanie
- Ilustracja
- Iteracyjne sortowanie przez scalanie
- Analiza złożoności algorytmu sortowania przez scalanie
- Wniosek
- rekomendowane lektury
Przegląd
Sortowanie przez scalanie jest wykonywane w następujący sposób:
# 1) Lista do posortowania jest podzielona na dwie tablice o równej długości poprzez podzielenie listy na środkowym elemencie. Jeśli liczba elementów na liście wynosi 0 lub 1, lista jest uważana za posortowaną.
#dwa) Każda podlista jest sortowana indywidualnie przy użyciu rekurencyjnego sortowania przez scalanie.
# 3) Posortowane podlisty są następnie łączone lub scalane w celu utworzenia kompletnej posortowanej listy.
Algorytm ogólny
Ogólny pseudokod dla techniki sortowania przez scalanie jest podany poniżej.
Zadeklaruj tablicę Arr o długości N
Jeśli N = 1, Arr jest już posortowany
Jeśli N> 1,
Lewy = 0, prawy = N-1
Znajdź środek = (lewy + prawy) / 2
Wywołaj merge_sort (Arr, left, middle) => sortuj rekursywnie pierwszą połowę
Wywołaj merge_sort (Arr, middle + 1, right) => sortuj rekurencyjnie drugą połowę
Wywołaj scalanie (Arr, left, middle, right), aby scalić posortowane tablice w powyższych krokach.
Wyjście
Jak pokazano na powyższym pseudokodzie, w algorytmie sortowania przez scalanie dzielimy tablicę na pół i sortujemy każdą połowę za pomocą rekurencyjnego sortowania merge. Gdy pod-tablice zostaną posortowane indywidualnie, dwie pod-tablice są łączone razem w celu utworzenia kompletnej posortowanej tablicy.
Pseudokod do sortowania przez scalanie
Poniżej znajduje się pseudokod techniki scalania. Po pierwsze, mamy procedurę merge sort, która rekurencyjnie dzieli tablicę na połowy. Następnie mamy procedurę scalania, która połączy posortowane mniejsze tablice, aby uzyskać pełną posortowaną tablicę.
procedure mergesort( array,N ) array – list of elements to be sorted N – number of elements in the list begin if ( N == 1 ) return array var array1 as array = a(0) ... a(N/2) var array2 as array = a(N/2+1) ... a(N) array1 = mergesort(array1) array2 = mergesort(array2) return merge( array1, array2 ) end procedure procedure merge(array1, array2 ) array1 – first array array2 – second array begin var c as array while ( a and b have elements ) if ( array1(0) > array2(0) ) add array2 (0) to the end of c remove array2 (0) from array2 else add array1 (0) to the end of c remove array1 (0) from array1 end if end while while ( a has elements ) add a(0) to the end of c remove a(0) from a end while while ( b has elements ) add b(0) to the end of c remove b(0) from b end while return c end procedure
Zilustrujmy teraz technikę sortowania przez scalanie na przykładzie.
Ilustracja
Powyższą ilustrację można przedstawić w formie tabelarycznej poniżej:
Przechodzić | Niesortowana lista | podzielić | Posortowana lista |
---|---|---|---|
1 | {12, 23,2,43,51,35,19,4} | {12,23,2,43} {51,35,19,4} | {} |
dwa | {12,23,2,43} {51,35,19,4} | {12,23} {2,43} {51,35} {19.4} | {} |
3 | {12,23} {2,43} {51,35} {19.4} | {12,23} {2,43} {35,51} {4.19} | {12,23} {2,43} {35,51} {4.19} |
4 | {12,23} {2,43} {35,51} {4.19} | {2,12,23,43} {4,19,35,51} | {2,12,23,43} {4,19,35,51} |
5 | {2,12,23,43} {4,19,35,51} | {2,4,12,19,23,35,43,51} | {2,4,12,19,23,35,43,51} |
6 | {} | {} | {2,4,12,19,23,35,43,51} |
Jak pokazano na powyższej ilustracji, najpierw macierz jest podzielona na dwie podmacierze o długości 4. Każda pod macierz jest dalej dzielona na dwie kolejne podmacierze o długości 2. Każda podmacierz jest następnie dalej dzielona na podmacierz po jednym elemencie każdy. Cały ten proces to proces „dzielenia”.
Po podzieleniu tablicy na pod-tablice składające się z jednego elementu, musimy teraz scalić te tablice w kolejności posortowanej.
Jak pokazano na powyższej ilustracji, rozważamy każdą podtablicę pojedynczego elementu i najpierw łączymy elementy, aby utworzyć pod-tablice dwóch elementów w kolejności posortowanej. Następnie posortowane podtablice o długości dwóch są sortowane i łączone w celu utworzenia dwóch podtablic o długości po cztery każda. Następnie łączymy te dwie pod-tablice, aby utworzyć kompletną posortowaną tablicę.
Iteracyjne sortowanie przez scalanie
Algorytm lub technika sortowania przez scalanie, które widzieliśmy powyżej, wykorzystuje rekurencję. Jest również znany jako „ rekurencyjne sortowanie przez scalanie ”.
Wiemy, że funkcje rekurencyjne używają stosu wywołań funkcji do przechowywania pośredniego stanu wywołania funkcji. Przechowuje również inne informacje księgowe dla parametrów itp. I stanowi obciążenie w zakresie przechowywania rekordu aktywacji wywołania funkcji, a także wznowienia wykonywania.
Wszystkich tych narzutów można się pozbyć, jeśli użyjemy funkcji iteracyjnych zamiast rekurencyjnych. Powyższy algorytm sortowania przez scalanie można również łatwo przekształcić w kroki iteracyjne przy użyciu pętli i podejmowania decyzji.
Podobnie jak rekurencyjne sortowanie przez scalanie, iteracyjne sortowanie przez scalanie również ma złożoność O (nlogn), a zatem pod względem wydajności, działają one na równi ze sobą. Po prostu jesteśmy w stanie obniżyć koszty ogólne.
W tym samouczku skupiliśmy się na rekurencyjnym sortowaniu przez scalanie, a następnie zaimplementujemy rekurencyjne sortowanie przez scalanie przy użyciu języków C ++ i Java.
Poniżej podano implementację techniki sortowania przez scalanie w języku 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< Wynik:
Podaj liczbę elementów do posortowania: 10
Wpisz 10 elementów do posortowania: 101 10 2 43 12 54 34 64 89 76
Posortowana tablica
2 10 12 34 43 54 64 76 89 101
W tym programie zdefiniowaliśmy dwie funkcje, merge_sort i iść . W funkcji merge_sort dzielimy tablicę na dwie równe tablice i wywołujemy funkcję merge na każdej z tych tablic podrzędnych. W funkcji scalania wykonujemy faktyczne sortowanie na tych tablicach podrzędnych, a następnie łączymy je w jedną kompletną posortowaną tablicę.
Następnie wdrażamy technikę Merge Sort w języku Java.
class MergeSort { void merge(int arr(), int beg, int mid, int end) { int left = mid - beg + 1; int right = end - mid; int Left_arr() = new int (left); int Right_arr() = new int (right); for (int i=0; i Wynik:
Tablica wejściowa
101 10 2 43 12 54 34 64 89 76
Tablica posortowana za pomocą sortowania przez scalanie
2 10 12 34 43 54 64 76 89 101
Również w przypadku implementacji w Javie używamy tej samej logiki, co w implementacji C ++.
Sortowanie przez scalanie to skuteczny sposób sortowania list i jest używany głównie do sortowania połączonych list. Ponieważ wykorzystuje podejście dziel i zwyciężaj, technika sortowania przez scalanie działa równie wydajnie zarówno w przypadku mniejszych, jak i większych tablic.
Analiza złożoności algorytmu sortowania przez scalanie
Wiemy, że aby przeprowadzić sortowanie przy użyciu sortowania przez scalanie, najpierw dzielimy tablicę na dwie równe połowy. Jest to reprezentowane przez „log n”, który jest funkcją logarytmiczną, a liczba wykonanych kroków wynosi najwyżej log (n + 1).
Aby znaleźć środkowy element tablicy, potrzebujemy jednego kroku, czyli O (1).
Następnie, aby scalić pod-tablice w tablicę n elementów, weźmiemy O (n) czasu działania.
Zatem całkowity czas wykonania sortowania przez scalanie wyniesie n (log n + 1), co daje nam złożoność czasową O (n * logn).
W najgorszym przypadku złożoność czasowa O (n * log n) Złożoność czasu w najlepszym przypadku O (n * log n) Średnia złożoność czasowa O (n * log n) Złożoność przestrzeni Na)
Złożoność czasowa sortowania przez scalanie jest taka sama we wszystkich trzech przypadkach (najgorszy, najlepszy i średni), ponieważ zawsze dzieli tablicę na pod-tablice, a następnie scala pod-tablice w czasie liniowym.
Sortowanie przez scalanie zawsze zajmuje tyle samo miejsca, co nieposortowane tablice. Dlatego gdy sortowana lista jest tablicą, sortowanie przez scalanie nie powinno być używane w przypadku bardzo dużych tablic. Jednak sortowanie przez scalanie może być efektywniej używane do sortowania połączonych list.
Wniosek
Sortowanie przez scalanie wykorzystuje strategię „dziel i rządź”, która dzieli tablicę lub listę na wiele pod tablice i sortuje je indywidualnie, a następnie łączy w kompletną posortowaną tablicę.
Sortowanie przez scalanie działa szybciej niż inne metody sortowania, a także działa wydajnie w przypadku mniejszych i większych tablic.
Więcej informacji na temat szybkiego sortowania omówimy w naszym nadchodzącym samouczku!
=> Obejrzyj przewodnik szkoleniowy dla początkujących C ++ tutaj.
rekomendowane lektury
- Metoda MongoDB Sort () z przykładami
- Polecenie sortowania systemu Unix ze składnią, opcjami i przykładami
- Sortowanie powłoki w C ++ z przykładami
- Sortuj na stosie w C ++ z przykładami
- Wybór sortowania w C ++ z przykładami
- Sortuj bąbelkowe w C ++ z przykładami
- Sortuj przez wstawianie w C ++ z przykładami
- Szybkie sortowanie w C ++ z przykładami