Szybkie sortowanie w C

Szybkie sortowanie w C

„Quicksort lub Quick-Sort to algorytm sortowania. Szybkie sortowanie jest algorytmem podziału. Niech lista znaków zostanie posortowana przez:

Q w e r t y u i o p

Sortowana lista to:

E i o p q r t u y

To jest rodzaj wznoszenia. W tym artykule wyjaśnienie Quicksort, sortuje się, używając listy: „Q”, „W”, „E”, „R”, „T”, „Y”, „U”, „I”, ” O ”,„ p ” i język c."

Szybkie sortowanie w teorii

Z listy „Q”, „W”, „E”, „R”, „T”, „Y”, „U”, „I”, „O”, „P”, szybkie spojrzenie będzie wyglądać dla wartości centralnej, zwanej obrotem. Na posortowanej liście,

„E”, „I”, „O”, „P”, „Q”, „R”, „T”, „U”, „W”, „Y”

Pivot to „q” lub „r”, ponieważ lista jest nawet w liczbie. Gdyby lista była dziwna, obrotem wyraźnie byłby wartością środkową. „Q” przy indeksie 4 jest wybierane jako obrotek. Pamiętaj, że lista do sortowania jest,

Q w e r t y u i o p

a nie posortowana lista. Na tej listy jest 10 elementów.

Pierwszym etapem jest poszukiwanie obrotu (wartość centralna) na liście nieporozumień. Drugim etapem jest umieszczenie obrotu we właściwej pozycji na liście Unsorted (w tym przypadku indeks 4); i umieść wszystkie elementy, które są mniejsze niż obrotowe po lewej i wszystkie elementy, które są większe niż obrot po prawej stronie. Elementy po lewej stronie obrotu niekoniecznie muszą być sortowane, a elementy po prawej stronie obrotu niekoniecznie mogą być również sortowane. Ta faza jest fazą podziału lub podziału w algorytmie podziału i podbicia. Istnieją trzy części na tym etapie: lewa podpisa, prawa podpis. Środkowa sub-lista składa się tylko z jednego elementu, który jest obrotem. W przypadku wyżej wymieonej listy wynik byłby:

E i o p q w r t y u

Ponieważ obrotek znajduje się już w ostatecznej pozycji, ostatnim etapem jest sortowanie lewej podpisji i sortowanie prawej sub-listy. To jest podbicie. To zbieg okoliczności, że lewa podpisa w tym przypadku jest już posortowana. W tym przypadku właściwa podwodna jest nadal do sortowania. Sortowanie lewej i prawej sub-listy osobno wynik jest:

E i o p q r t u y

jako wymagane.

Szybkie sortowanie w praktyce

W praktyce partycjonowanie z pewnym sortowaniem (zamiany) odbywa się wielokrotnie w sposób rekurencyjny. Oznacza to, że nowe mniejsze i mniejsze podmioty są opracowywane z własnymi oświatami. Innymi słowy, z głównej listy opracowywane są trzyczęściowe mniejsze i mniejsze podmioty.

Występuje problem, jeśli chodzi o wybór obrotu. Całej listy nieposortowanej nie może być skanowana element po elementach, aby uzyskać właściwy obrot. To będzie czasochłonne. Tak więc należy zrobić inteligentne przypuszczenie.

Pamiętaj, że lista do sortowania jest:

Q w e r t y u i o p

Niech inteligentne zgadywanie będzie P, prawym elementem. Następnie niech wszystkie elementy mniej niż p, czytanie z lewej, pójdą na lewo od P i pozwól wszystkim elementom większe niż p, wciąż czytając z lewej, pójść na prawo od P bez świadomego sortowania. To daje:

E i o p q w r t y u

Pierwsze trzy podlity to:

„E”, „i”, „o”, „p”, „q”, „w”, „r”, „t”, „y”, „u”

P jest na prawej pozycji (w praktyce niekoniecznie może być indeks 4; tutaj jest indeks 3 na tym etapie). Następnym krokiem jest rekurencyjne wezwanie do podzielenia lewej podlity na trzy pod liści; i odpowiednia podpisa na trzy pod litera, każda z własnym obrotem, od inteligentnego zgadywania.

Dzielenie „e”, „i”, „o”
Niech jego inteligentne zgadnij, o, o, prawy element. Wszystkie elementy, które są mniejsze niż o, muszą przejść w lewo, a wszystkie elementy, które są większe niż O muszą iść w prawo, czytając oba przypadki od lewej. To daje:

„E”, „i”, „o”,

bez elementu po prawej stronie. Jeśli „e”, „i” jest również rekurencyjnie podzielone, to [„e”, „i”, ] wynika to. I tak sortowany pierwszy lewy podpisa jest:

„E”, „i”, „o”

Dzielenie „Q”, „W”, „R”, „T”, „Y”, „U”
„Q”, „W”, „R”, „T”, „Y”, „U” jest pierwszą prawą podmiotem listy. Niech jego inteligentne obrotowe zgadnij, będzie u, prawym elementem. Wszystkie elementy, które są mniejsze niż ty, muszą iść w lewo, a wszystkie elementy, które są większe niż musisz iść w prawo; czytanie obu przypadków, od lewej. To daje:

„Q”, „r”, „t”, „u”, „w”, „t”

Przez rekursywne podział „q”, „r”, „t” i „w”, „t” w ten sam sposób, pierwszą prawą podpisą byłoby:

„Q”, „R”, „T”, „U”, „W”, „Y”

A pełna posortowana lista byłaby:

E i o p q r t u y

Zwróć uwagę, że każda partycja sortuje w szerokim sensie, umieszczając nieprojektowane niższe wartości po lewej i nieporządkowane wyższe wartości po prawej stronie.

Zwróć również uwagę, że inteligentne przypuszczenie po prostu wybierało właściwy element sub-list. To nie jest najlepsze inteligentne przypuszczenie. Z drugiej strony rozwiązaniem (dla inteligentnego przypuszczenia) nie jest skanowanie całej listy podanej! - Zobacz poniżej, aby uzyskać lepsze opcje.

Kod szybkiego sortowania w C

Chociaż dla każdej powyższej listy wybrano najwyższą prawą wartość, konwencjonalnie, jest to wybrana najwyższa wartość lewej. Nawet gdy zostanie wydane bardziej inteligentne przypuszczenie, dobra wartość, która zgadnie będzie musiała zostać umieszczona w pozycji najwyższej w lewej; a lewa wartość, która tam była, zostanie umieszczona w innej odpowiedniej pozycji (wciąż na liście).

Istnieją cztery funkcje C z nazwami, swap (), pivot (), parition () i QuickSort (). QuickSort (), funkcja, jest kodowana w sposób rekurencyjny i wywołuje inne funkcje.

Funkcja swap ()
Ta funkcja zamienia dwa elementy tablicy, wykorzystując ich wskaźniki. To jest:

void swap (char a [], int m, int n)
char temp = a [m];
A [m] = a [n];
A [n] = temp;

Prosta funkcja Pivot ()
Ta funkcja wybiera między najwyższym lewym elementem a prawym elementem podanej całej listy. Stawia mniejszą pozycję w lewej pozycji, a większa w pozycji najbardziej prawej. To jest:

void Pivot (char a [], int lewy, int po prawej)
if ([lewy]> a [prawy])
zamiana (a, po lewej, prawej);

Jest to lepsze niż tylko wybór właściwego elementu dla listy i sub-list, jak to zrobiono powyżej. Poniżej podano jeszcze lepszą funkcję Pivot ().

Funkcja partycji ()
Podobnie jak funkcja PIVOT () może być napisana na różne sposoby, funkcję parition () można pisać na różne sposoby. Wybrany do tego artykułu to:

Int parition (char a [], int lewy, int po prawej)
int Pivot = a [lewy];
int i = left;
int j = right + 1;
Do
do ++ i;
while ([i] obrotu);
Jeśli ja < j)
zamiana (a, i, j);
podczas gdy ja < j);
zamiana (a, j, po lewej);
powrót J;

Po umieszczeniu elementu Pivot w lewej pozycji listy lub sub-list, przez funkcję Pivot (), funkcja partycji skanuje listę lub podpis obrotu. Skanowanie z lewego końca rozpoczyna się po obrotowym zakończeniu lewego końca (listy lub listy); Ponieważ Out zostanie zamieniony na koniec („do ++ i;” powyżej).

Indeks powrotu, J, to nowa (następna) pozycja obrotowa.

Funkcja Quicksort ()
Jest to funkcja rekurencyjna, która wywołuje inne funkcje. To jest:

void Quicksort (char a [], int lewy, int prawy)
if (po lewej < right)
Pivot (a, lewy, prawy);
int k = partycja (a, po lewej, po prawej);
Quicksort (A, po lewej, K-1);
Quicksort (A, K+1, po prawej);

Tutaj k jest tym samym, co J zwrócone powyżej.

Wszystkie powyższe funkcje kodowane razem, w opisanej kolejności, utworzą program Quicksort.

Główna funkcja C

Odpowiednią główną funkcją C do testowania programu jest:

int main (int argc, char ** argv)

char a [] = „q”, „w”, „e”, „r”, „t”, „y”, „u”, „i”, „o”, „p”;
int sz = sizeof (a)/sizeof (a [0]);
Quicksort (A, 0, SZ-1);
dla (int i = 0; iprintf („%c”, a [i]);
printf („\ n”);
powrót 0;

Prawo funkcji Quicksort () jest wywoływane z głównej funkcji C, przekazując tablicę jako pierwszy argument. Drugim argumentem pozostawionym jest indeks, 0, całej listy. Trzecim argumentem, prawym, jest wskaźnik ostatniego drugiego na całej liście.

Mediana Pivot

Jeśli trzy różne liczby są ułożone w kolejność rosnącą, wówczas mediana jest wartością środkową (drugą). Lepszym sposobem niż poprzedni, aby uzyskać obrotek, jest poszukiwanie mediany, między wartością najbliższą lewej, środkową wartością listy lub podmiotów, a wartością najbardziej prawej. Kod to:

int midIndex = (lewy + prawy) / 2; // Numer całkowitego pobrany
if ([midIndex] < A[left])
zamiana (a, po lewej, midIndex);
if ([racja] < A[left])
zamiana (a, po lewej, prawej);
if ([midIndex] < A[right])
zamiana (a, midindex, po prawej);
Char Pivot = a [prawy];

Zauważ, że trzy elementy mogły zmienić pozycje. Ten kod jest połączony z powyższą funkcją Pivot (), aby mieć:

void Pivot (char a [], int lewy, int po prawej)
// uzyskanie mediany
int midIndex = (lewy + prawy) / 2; // Numer całkowitego pobrany
if ([midIndex] < A[left])
zamiana (a, po lewej, midIndex);
if ([racja] < A[left])
zamiana (a, po lewej, prawej);
if ([midIndex] sworzeń)
zamiana (a, po lewej, prawej); // w przeciwnym razie [lewy] jest obrotem

Zwróć uwagę na ostatnią kondycję IF.

Wniosek

Quick-Sort to podział i pokonuje algorytm sortowania. Nadal dzieli (partycjonowanie) listy na trzy podlity rekurencyjnie. Środkowa sub-lista zawsze składa się z jednego elementu, który jest obrotem. Tworząc obrotność, sortowanie odbywa się w szerokim sensie na tym etapie. Jednak w miarę kontynuowania rekurencji doskonałe sortowanie jest uzyskiwane na końcu programu.