Scal sort w Javie, wyjaśniono

Scal sort w Javie, wyjaśniono
Lista lub tablica, której indeksowanie (liczenie) zaczyna się od zera, można o połowę. Pytanie brzmi, gdy całkowita liczba elementów na liście jest dziwna, jaka jest lewa połowa i jaka jest prawą połowę. Kiedy całkowita liczba elementów jest równa, nie ma problemu. Jeśli długość listy wynosi 8, powiedzmy, wówczas lewa połowa ma pierwsze 4 elementy, a prawa połowa ma następne 4 elementy. Jeśli długość listy wynosi 5, powiedzmy, co jest dziwne, to z konwencji, lewa połowa ma pierwsze 3 elementy, a prawa połowa ma następne 2 elementy.

Jeśli długość listy wynosi 8, wówczas indeks elementu środkowego (środkowego) jest uważany za 3, czyli czwarty element - zliczanie indeksu rozpoczyna się od 0. Tak więc, gdy długość listy jest równa, indeks dla elementu środkowego jest długość / 2 - 1.

Jeśli długość listy wynosi 5, wówczas indeks elementu środkowego jest uważany za 2, który jest trzecim elementem. Tak więc, gdy długość listy jest dziwna, indeks dla elementu środkowego jest długość / 2 - 1/2.

Nietrudno jest uzyskać środkowy indeks listy z Javą! - Po prostu użyj arytmetyki całkowitej. Wyrażenie średniego indeksu to:

najwyższystindex / 2

Jeśli więc długość wynosi 8, najwyższy wskaźnik, który wynosi 7, jest podzielony przez 2, aby dać 3 i 1/2. Arytmetyka całkowitą odrzuca połowę, pozostawiając 3, czyli długość / 2 - 1.

Jeśli długość wynosi 5, najwyższy wskaźnik, który wynosi 4, jest podzielony przez 2, aby dać 2, czyli długość / 2 - 1/2.

SOTE SORT to algorytm sortowania. W tym samouczku sortowanie spowoduje ostateczną listę, od najmniejszej do najwyższej wartości. Scal sort. Reszta tego samouczka wyjaśnia, że ​​dotyczy to Java.

Treść artykułu

  • Podziel i podbij się w celu scalania
  • Główna metoda rekurencji
  • Metoda conquer ()
  • Tymczasowa tablica metody conquer ()
  • Wniosek

Podziel i podbij się w celu scalania

Podziel środki, aby podzielić nieprojektowaną listę na dwie połowy, jak wyjaśniono powyżej. Następnie podziel każdą połówki na dwie kolejne połówki. Dziel się powstałe połówki, dopóki nie będą n list jednego elementu, gdzie n jest długością oryginalnej listy.

Conquer oznacza rozpoczęcie parowania kolejnych list na jedną listę podczas sortowania uzyskanej listy. Para trwa do momentu uzyskania ostatecznej sortowanej listy długości, która jest równa oryginalnej długości.

Rozważ nieporozumieoną listę liter alfabetycznych:

M K Q C E T G

Długość tej listy to 7. Poniższy schemat ilustruje, w jaki sposób scalanie tej listy odbywa się teoretycznie:

Z diagramu podział na pojedyncze wartości robi 3 kroki. Zdobywca, który się łączy i sortuje, wykonuje kolejne 3 kroki, aby mieć sortowaną listę końcową.

Czy programista napisze 6 segmentów kodów, aby to osiągnąć? - NIE. Programista musi mieć schemat rekurencji przy użyciu listy tymczasowej.

Nawiasem mówiąc, zauważ, że G wygląda dość dziwnie w pozycji dla podziału pierwszej prawej połowy. Wynika to z faktu, że długość listy jest liczbą nieparzystą, 7. Gdyby długość była liczbą parzystą, powiedz 6, Q wydawałby się tak dziwny w podobny sposób dla podziału pierwszej lewej połowy.

Reszta tego artykułu wyjaśnia „scalanie sort w Javie”, korzystając z listy Unsorted:

M K Q C E T G

Główna metoda rekurencji

W tym programie są trzy metody. Metody to metoda Divide (), metoda conquer () i metoda main (). Metoda Divide () jest główną metodą. Wielokrotnie wzywa się do lewej i prawej połówki i wywołuje metodę conquer () na końcu ciała. Kod dla głównej metody to:

void Divide (char arr [], int beg, int end)
int Mid;
if (błaganie < end)
mid = (beg + end)/2;
podziel (ARR, Beg, Mid);
podziel (ARR, MID+1, END);
podbijaj (ARR, błaganie, w połowie, koniec);

Na początku wymaga podanej tablicy, początkowy (Beg) wskaźnik tablicy, który wynosi 0, i indeks tablicy końcowej, który ma 6. Metoda nie zostanie wykonana, jeśli nie ma co najmniej dwóch elementów. Kontrola odbywa się przez klimatyzację IF: „If (Beg < end)”. The first divide() recall calls the left half of the list, and the second divide() recall calls the right to half of the list.

Tak więc, dla pierwszego wykonania lub przejścia, metody Divide (), klimat IF jest spełniony (więcej niż jeden element). Wskaźnik środkowy to 3 = (0 + 6) / 2 (arytmetyka całkowitą). Trzy wywołania metod i ich porządek z ich argumentami stają się:

podziel (ARR, 0, 3);
podziel (ARR, 4, 6);
conquer (ARR, 0, 3, 6);

Są tutaj trzy połączenia. Pierwsze z tych połączeń ponownie wywołują metodę Divide () dla lewej połowy listy. Dwie dwie metody są odnotowane i zarezerwowane w ich kolejności, które zostaną wykonane później. Drugi wywołanie podziału () wywołałoby metodę Divide () dla prawej połowy listy. Metoda podbicia wykonałaby dwie pierwsze połówki razem.

Przed drugim przejściem metody Divide () lista należy uznać za podzieloną na dwa w następujący sposób:

M K Q C E T G

W drugim przejściu metody Divide () uczęszczana jest lewa połowa listy. Wezwanie do drugiej przepustki to:

podziel (ARR, 0, 3);

Tym razem wskaźnik środkowy to, 1 = (0 + 3) / 2 (arytmetyka całkowitą). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 0, 1);
podziel (ARR, 2, 3);
conquer (ARR, 0, 1, 3);

Zauważ, że nowy indeks końcowy to 3, czyli koniec pierwszej lewej połowy. Pierwsze z tych połączeń ponownie wywołuje metodę Divide () dla lewej połowy pierwszej lewej połowy listy. Dwie dwie metody są odnotowane i zarezerwowane w ich kolejności, które zostaną wykonane później, z ich nowymi argumentami. Drugi wywołanie podziału () wywołałoby metodę Divide () dla prawej połowy pierwszej lewej połowy listy. Metoda conquer () wykonałaby dwie nowe połówki.

Przed trzecim przejściem metody Divide () lista należy uznać za podzieloną w następujący sposób:

M K Q C E T G

Trzecie przejście metody podziału to wywołanie:

podziel (ARR, 0, 1);

W tym trzecim przejściu metody podzielonej () uczestniczy lewa połowa nowej podmiotów, o której mowa lista. Tym razem wskaźnik środkowy to, 0 = (0 + 1) / 2 (arytmetyka całkowitą). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 0, 0);
podziel (ARR, 1, 1);
conquer (ARR, 0, 0, 1);

Zauważ, że nowy indeks końcowy to 1, czyli koniec nowej lewej połowy. Pierwsze z tych połączeń jest,

podziel (ARR, 0, 0);

Upadają się z powodu kwalifikacji IF: „If (błagaj < end)” - beg, and end are the same, meaning there is only one element. The second divide() method,

podziel (ARR, 1, 1);

Również zawodzi z podobnego powodu. W tym momencie lista należy uznać za podzieloną jako,

M K Q C E T G

Trzecie połączenie to:

conquer (ARR, 0, 0, 1);

Wezwanie podboju dwóch pod-list. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstała podpisa byłaby K M. Cała lista stałaby się:

K M q c e t g

Pamiętaj, że istnieją metody, które zostały odnotowane i zastrzeżone. Byłyby wezwani w odwrotnej kolejności, teraz z,

podziel (ARR, 2, 3);

To jest czwarta przepustka metody Divide (). Ma to na celu obsługę podpisji, Q C, którego początkowy wskaźnik to 2, a indeks końcowy to 3. Indeks średni wynosi teraz 2 = (2 + 3) / 2 (arytmetyka całkowita). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 2, 2);
podziel (ARR, 3, 3);
conquer (ARR, 2, 2, 3);

Piąte przepustki metody Divide () to wywołanie,

podziel (ARR, 2, 2);

Zauważ, że indeks początkowy i końcowy są taki sam, co oznacza, że ​​istnieje tylko jeden element. To połączenie nie powiada się z powodu kondycji IF: „If (Beg < end)”. The second divide() call,

podziel (ARR, 3, 3);

Również zawodzi z tego samego powodu. W tym momencie lista należy uznać za podzieloną jako,

K M q c e t g

Trzecie wywołanie w przepustce metody to:

conquer (ARR, 2, 2, 3);

Wezwanie podboju dwóch podpisów to Q i C, każda składa się z jednego elementu. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstała podpisa byłaby c q. Cała lista stałaby się:

K M C Q E T G

Pamiętaj, że wciąż istnieją metody, które zostały odnotowane i zastrzeżone. Nadal będą powołani w odwrotnej kolejności; teraz z,

podziel (ARR, 4, 6);

To jest szósta przejście metody Divide (). Ma to na celu obsługę podpisji, e t t g, którego początkowy wskaźnik to 4, a indeks końcowy to 6. Indeks średni wynosi teraz 5 = (4 + 6) / 2 (arytmetyka całkowita). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 4, 5);
podziel (ARR, 5, 6);
conquer (ARR, 4, 5, 6);

Siódme przejście metody Divide () to połączenie,

podziel (ARR, 4, 5);

Dwa dwa połączenia są odnotowane i zastrzeżone. Zauważ, że nowy indeks końcowy to 5, czyli koniec nowej lewej połowy. Indeks średni wynosi teraz 4 = (4 + 5) / 2 (arytmetyka całkowita). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 4, 4);
podziel (ARR, 5, 5);
conquer (ARR, 4, 4, 5);

Ósma przepustka to:

podziel (ARR, 4, 4);

Zauważ, że indeks początkowy i końcowy są taki sam, co oznacza, że ​​istnieje tylko jeden element. To połączenie nie powiada się z powodu kondycji IF: „If (Beg < end)”. The second divide() method call is,

podziel (ARR, 5, 5);

Który również zawodzi z tego samego powodu. W tym momencie lista należy uznać za podzieloną jako,

K M C Q E T G

Trzecie połączenie to:

conquer (ARR, 4, 4, 5);

Jest to podbicie wezwanie do dwóch pod-list. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstałą sub-list byłby E G . Cała lista stałaby się:

K M q c e t g

Chociaż sekwencja E T pozostaje taka sama, zauważ, że sortowanie miało miejsce, chociaż ostatni sort.

Pamiętaj, że wciąż istnieją metody, które zostały odnotowane i zastrzeżone. Są one wywoływane w odwrotnej kolejności. Będą teraz nazywane początkiem,

podziel (ARR, 5, 6);

Zauważ, że nowy indeks końcowy to 6, czyli koniec nowej prawej połowy. Indeks średni wynosi teraz 5 = (5 + 6) / 2 (arytmetyka całkowita). Metoda wywołuje, ich porządek i argumenty stają się,

podziel (ARR, 5, 5);
podziel (ARR, 6, 6);
conquer (ARR, 5, 5, 6);

Pierwsze dwa połączenia się nie powiodą, ponieważ zajmują. W tym momencie cała lista to:

K M q c e t g

Następne połączenie to:

conquer (ARR, 5, 5, 6);

Jest to podbicie wezwanie do dwóch pod-list. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstała lista byłaby g t . Cała lista stałaby się:

K M q c e g t

Pamiętaj, że wciąż istnieją metody, które zostały odnotowane i zastrzeżone. Są one wywoływane w odwrotnej kolejności. Następny, który można nazwać,

conquer (ARR, 0, 1, 3);

Jest to podbicie wezwanie do dwóch podpisów: K M i Q C: Pierwsza podpisa składająca się z dwóch elementów, a druga podpisa składająca się z dwóch elementów. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstała podpisa byłaby c k m q. Cała lista stałaby się:

C K M Q E G T

Kolejna zauważona i zastrzeżona metoda conquer () jest:

conquer (ARR, 4, 5, 6);

Jest to podbijanie dwóch substancji: e g i t. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstała lista byłaby e g t. Cała lista stałaby się:

C K M Q E G T

Ostatnie wezwanie Conquer () odnotowane i zastrzeżone to:

conquer (ARR, 0, 3, 6);

Jest to podbicie wezwanie do dwóch podpisów: c k m q i e g t: pierwsza podpisa składająca się z czterech elementów, a druga podpisa składająca się z trzech elementów. Metoda conquer () łączy się i sortuje dwie sub-listy. Powstałą podpisą byłby C e g k m q t, czyli cała sub-lista, to znaczy:

C E G K M Q T

A to kończy się połączeniem i sortowaniem.

Metoda conquer ()

Metoda podbicia łączy się i sortuje dwie sub-listę. Podpis składa się z co najmniej jednej wartości. Metoda podbicia przyjmuje jako argument, oryginalna tablica, indeks początkowy pierwszej podwładki, wskaźnik środkowy dwóch kolejnych podmiotów podmiotowych, a także wskaźnik końcowy drugiej substancji podmiotowej. Metoda podbicia ma tymczasową tablicę, której długość jest długością oryginalnej tablicy. Kod metody podbicia to:

void conquer (char arr [], int beg, int mid, int end)
int i = beg, j = mid+1, k = bEG, indeks = beg;
char temp [] = new char [7];
podczas gdy ja<=mid && j<=end)
if (arr [i]temp [indeks] = arr [i];
i = i+1;

w przeciwnym razie
temp [indeks] = arr [j];
j = j+1;

indeks ++;

if (i> mid)
While (j<=end)
temp [indeks] = arr [j];
indeks ++;
J ++;


w przeciwnym razie
podczas gdy ja<=mid)
temp [indeks] = arr [i];
indeks ++;
i ++;


k = Beg;
While (karr [k] = temp [k];
K ++;

Główną metodą jest:

public static void main (string [] args)
char arr [] = 'm', „k ',„ q ”,„ c ”,„ e ”,„ t ”,„ g ”;
Thlass mergesort = new theClass ();
łączyć się.podziel (ARR, 0,6);
System.na zewnątrz.println („posortowane elementy:”);
dla (int i = 0; i<7;i++)
System.na zewnątrz.print (ARR [i]); System.na zewnątrz.wydrukować(");

System.na zewnątrz.println ();

Metoda Divide (), metoda conquer () i metoda main () należy łączyć w jedną klasę. Wyjście to:

C E G K M Q T

Zgodnie z oczekiwaniami.

Tymczasowa tablica metody conquer ()

W miarę sortowania pary podpisów, wynik jest utrzymywany w tablicy tymczasowej, temp []. Układ wartości w tablicy tymczasowej ostatecznie zastępuje zawartość oryginalnej tablicy. Poniżej pokazuje układ w oryginalnej tablicy oraz układu tymczasowego dla różnych wywołań metody conquer ():

conquer (ARR, 0, 0, 1);
ARR [7]: M K Q C E T G
Temp [7]: K M - - - - -
conquer (ARR, 2, 2, 3);
ARR [7]: K M Q C E T G
Temp [7]: K M C Q - - -
conquer (ARR, 4, 4, 5);
ARR [7]: K M C Q E T G
Temp [7]: K M C Q E T -
conquer (ARR, 5, 5, 6);
ARR [7]: K M C Q E T G
Temp [7]: k m c q e g t
conquer (ARR, 0, 1, 3);
ARR [7]: K M C Q E G T
Temp [7]: C K M Q E G T
conquer (ARR, 4, 5, 6);
ARR [7]: C K M Q E G T
Temp [7]: C K M Q E G T
conquer (ARR, 0, 3, 6);
ARR [7]: C K M Q E G T
Temp [7]: C E G K M Q T

Wniosek

SOTE SORT to schemat sortowania, który wykorzystuje paradygmat podziału i podbijania. Dzieli listę elementów na pojedyncze elementy, a następnie zaczyna łączyć kolejne pary podpisów, posortowane, zaczynając od podliści pojedynczej elementu. Procedury podziału i podboju są razem wykonane rekurencyjnie. Ten samouczek wyjaśnił, jak to się dzieje w Javie.

Chrys