Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

selection sort

Ostatnio zmodyfikowano 2015-12-24 12:29
Autor Wiadomość
locf
Temat założony przez niniejszego użytkownika
selection sort
» 2015-12-24 11:05:41
Znów prośba o pomoc.
Mam taki program odnoszący się do zagadnienia sortowania, które jest nowe dla mnie.
W niektórych liniach kodu zamieściłem komentarze jak ja to rozumiem.
Proszę abyście sprawdzili, czy to co napisałem w tych komentarzach ma sens, czy może należy to rozumieć inaczej.
W pewnych miejscach napisałem w komentarzu, że czegoś nie rozumiem, więc moja prośba o komentarz z Waszej strony o co w tej linii kodu chodzi.

C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

//  ilość wczytywanych liczb
const int n = 5;

int main( int argc, char * argv[] )
{
   
    double a[ n ]; // tablica 'a', która posiada 'n' zmiennych typu 'double'
    int i, i_min, j;
    double temp;
   
    cout << "Program wektor_3, czyli proste sortowanie\n\n";
   
    cout << "Wczytywanie danych:\n";
   
    // najpierw wczytamy ciąg do posortowania
    for( i = 0; i < n; i++ ) // zapisuję liczby do tablicy o 'i-tym' indeksie
    {
        cout << " Podaj " << i << " element ciągu: ";
        cin >> a[ i ];
    }
   
    for( i = 0; i < n - 1; i++ ) /*nie wiem dlaczego jest 'n-1'.
        Jeśli n=5, to przy warunku i<n-1 tylko i={0,1,2,3}
        spełniają ten warunek, więc są to tylko 4 liczby. Przy czym program wczytuje 5 liczb. Tego nie rozumiem.*/
    {
        // najpierw zakładam, że pierwszy element jest najmniejszy,
        // dlatego przypisuję wartość zmiennej o indeksie 'i' do zmiennej o indeksie 'i_min' - Czy tak to należy rozmieć ?
        i_min = i;
       
        // następnie sprawdzamy, czy któryś z następnych elementów nie jest
        //  przypadkiem mniejszy, a jeśli jest, to zapamiętujemy jego położenie
       
        for( j = i + 1; j < n; j++ ) /*wiem, że tutaj sprawdza się, czy przypadkiem inny
                element tablicy nie jest mniejszy od pierwszego elementu o indeksie 'i' - uznanego początkowo za najmniejszy.
                Czy 'j=i+1' oznacza indeks pierwszego elementu w nieposortowanej części tablicy?
                Czy nierówność 'j<n' jest dodana, bo w nieposortowanej części tablicy mam tylko 4 elementy i zaczynam
                sortowaanie od elementu z indeksem j=1, a kończę na elemencie z indeksem j=4?
       
                Jeśli mam 5 elementów, z których jeden wstępnie uznaje za najmniejszy, czyli jeden jest
                posortowany, to zostało mi do posortowania 4.*/
        if( a[ j ] < a[ i_min ] ) /* jeśli prawdą jest, że element tablicy uznany początkowo za najmniejszy,
              czyli element o indeksie 'i_min' jest jednak większy od elementu z indeksem 'j', to
              zamieniam numer indeksu 'j' z indeksem 'i_min*/
             i_min = j;
       
        temp = a[ i ]; /*tutaj do 'schowka' przypisuję element z indeksem 'i', który początkowo został uznany za najmniejszy,
            lecz najmniejszy nie był*/
       
        a[ i ] = a[ i_min ]; /*z kolei w miejsce elementu przeniesionego do schowka, czyli tego z indeksem 'i', przypisujemy
            wartość elementu, który jest rzeczywiście najmniejszy*/
       
        // a w to miejsce gdzie dotychczas umieszczony był najmniejszy element,
        //  umieszczamy ten, który był pierwszym
        a[ i_min ] = temp; /*w miejsce elementu o indeksie 'i_min' wpisuję element o indeksie 'i', który umieszczony był w schowku*/
    };
    for( i = 0; i < n; i++ )
         cout << "a[" << i << "] = " << a[ i ] << endl;
   
    return 0;
}

P-142298
costam
tytul
» 2015-12-24 12:29:06
Rozbij to sobie na KILKA małych funkcji a mainie tylko je wywołuj wtedy jest dużo prościej zrozumieć jak coś działa.
C/C++
int ZnajdzNajmniejszy( int * tab, int od, int doo ) //"do" jest zarezerwowane
{
    int i_min = tab[ od ];
    for( int i = od + 1; i < doo; i++ ) // +1 bo bo po co porównywac ten sam element
    {
        if( tab[ i ] < tab[ i_min ] )
             i_min = i;
       
    }
    return i_min;
}
void swap( int & a, int & b )
{
    int tmp( a );
    a = b;
    b = tmp;
}


//main
for( i = 0; i < n - 1; i++ ) // jak znajdzie 4 najmniejsze to wiadomo że 5 będzie ostatni czyli najwiekszy i nie trzeba go zmieniać
{
    int id = ZnajdzNajmniejszy( a, i, n ); //znajduje najmniejszy od i do n. Oczywiście nie od zera bo by znalazlo kolejny raz tą samą najmniejszą liczbę.
    swap( a[ i ], a[ id ]; //zamienia miejscami najmniejszy z pozostałych element na pierwszą pozycję(piewszą z pozostałych)
}
nie ma szans moja siostra by zrozumiała :D
P-142300
« 1 »
  Strona 1 z 1