Sortowanie przez wybór

Sortowanie (ang. sort) zbioru polega na wykonaniu takiej permutacji jego elementów, aby dla dowolnych dwóch elementów ai i aj należących do tego zbioru zachodziły poniższe warunki:

 

Zbiór uporządkowany niemalejąco:

 

Zbiór uporządkowany nierosnąco:

 

Permutację taką osiągamy, przestawiając odpowiednio elementy zbioru. Zatem algorytm sortujący zmienia kolejność elementów w zbiorze, jeśli nie spełniają one powyższych warunków. Przy opisie algorytmu zakładamy, iż chcemy uzyskać porządek niemalejący - kolejne elementy są albo coraz większe, albo równe.

Sortowanie przez wybór (ang. selection sort) polega na wyszukaniu w zbiorze pozycji elementu najmniejszego (lub, w innej wersji, elementu największego). Znaleziony element najmniejszy (w drugiej wersji największy) w zbiorze uporządkowanym powinien znaleźć się na samym początku (w drugiej wersji na samym końcu). Zatem wymieniamy element najmniejszy z pierwszym elementem zbioru. Do dalszych operacji zbiór pomniejszamy o pierwszy element, który już jest uporządkowany. Procedurę powtarzamy ponownie, znajdując drugi element najmniejszy. Element ten wymieniamy z elementem na pozycji drugiej. Procedurę kontynuujemy, aż zbiór będzie jednoelementowy. W wyniku otrzymujemy zbiór posortowany.

 

Algorytm sortowania przez wybór

Dane wejściowe:

n  - liczba elementów
T[] - tablica n elementowa zawierająca elementy do posortowania. Elementy są numerowane od 0 do n-1.

Dane wyjściowe:

T[] - tablica z posortowanymi elementami

Dane pomocnicze:

i,j - indeksy elementów T[]
vmin - wartość minimalna
pmin - pozycja wartości minimalnej w zbiorze

Lista kroków:

Krok 1: Dla i = 0,1,...,n-2: wykonuj kroki 2...9
Krok 2:     vminT[i]
Krok 3:     pmini
Krok 4:     Dla j = i+1,i+2,...,n-1: wykonuj kroki 5...8
Krok 5:         Jeśli T[j] ≥ vmin, to następny obieg
Krok 6:         vminT[j]
Krok 7:         pminj
Krok 8:         Następny obieg
Krok 9:     T[i] ↔ T[pmin]
Krok 10: Zakończ

Przykładowe dane dla programu:

Pierwsza liczba n określa ilość elementów w zbiorze. Następne n liczb definiuje n kolejnych elementów. Liczby zbioru są rzeczywiste.

100
311.58 125.55 -378.83 222.614 192.78 281.21 499.2 -67.17 -190.11 -355.854
-452.88 -14.33 -290.82 -382.94 491.62 -114.23 43.68 -165.22 -57.14 451.944
-81.21 429.24 -104.91 147.35 64.24 -420.34 -405.92 -335.13 -307.073 57.658
63.37 -165.96 -322.86 612.46 -63.72 245.47 69.957 435.526 489.225 41.146
311.06 -361.61 369.82 496.097 333.34 248.82 -197.91 -452.55 34.52 370.28
59.767 -50.481 265.92 -35.345 14.21 -161.67 -498.86 -386.22 -124.5 -222.74
319.1 -307.25 -68.49 -489.31 196.34 171.28 -361.22 -493.12 171.47 -409.77
398.42 58.691 378.22 -95.74 297.55 -204.4 362.510 111.386 -220.78 45.943
-199.874 -20.92 410.52 387.28 -221.11 179.67 -323.87 -178.77 176.25 -31.21
-75.48 279.5 -334.4 439.25 -382.8 303.405 207.925 -60.527 -481.694 -40.104
 

Program sortowania zbioru

 

// Sortowanie przez wybór
// (C)2010 I LO w Tarnowie
//------------------------

#include <iostream>

using namespace std;

int main()
{
    double * T,vmin,x;
    int i,j,n,pmin;

    // odczytujemy liczbę elementów

    cin >> n;

    // tworzymy tablicę dynamiczną o n elementach

    T = new double[n];

    // wczytujemy elementy do tablicy

    for(i = 0; i < n; i++) cin >> T[i];

    // sortujemy tablicę

    for(i = 0; i <= n-2; i++)
    {
        vmin = T[i];
        pmin = i;
        for(j = i + 1; j < n; j++)
            if(T[j] < vmin)
            {
                vmin = T[j];
                pmin = j;
            }
        x = T[i]; T[i] = T[pmin]; T[pmin] = x;
    }

    // wyświetlamy posortowaną tablicę

    cout << endl;

    for(i = 0; i < n; i++) cout << T[i] << " ";

    cout << endl;

    // usuwamy tablicę dynamiczną

    delete [] T;

    return 0;
}

 

Przerób program tak, aby sortował zbiór nierosnąco. Wypróbuj również drugą wersję, która sortuje zbiór od końca.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.