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

Nie moge zrozumiec jednej linijci w InsertionSort

Ostatnio zmodyfikowano 2015-11-21 20:27
Autor Wiadomość
maciek1o3s
Temat założony przez niniejszego użytkownika
Nie moge zrozumiec jednej linijci w InsertionSort
» 2015-11-21 18:18:52
Przepisałem z książki "Symfonia C++" algorytm InsertionSort i niestety nie działa mi.

Wygląda tak:
C/C++
void ist( int tab[], int n )
{
    for( int i = 1; i < n; i++ )
    {
        int j = i;
        int temp = tab[ j ];
        while(( j > 0 ) &&( tab[ j - 1 ] > temp ) )
        {
            tab[ j ] = tab[ j - 1 ];
            j--;
        }
        tab[ j ] = temp;
    }
}

Potem przy wywołaniu tablicy 5, 3, 1, 4, 6, 2 pokazuje mi ja posortowana.

Jednak nie rozumiem po co mamy linijke ostatnia
tab[ j ] = temp;

Jak ja wywale otrzymuje tablice 5, 5, 5, 5, 5, 6.

Nie za bardzo wiem czemu.

Ta linijka jak dla mnie jest bezuzyteczna bowiem na poczatku funkcji mamy int j=i a nastepnie int temp=tab[j],
wiec teraz tak, na koncu poprzez
tab[ j ] = temp;
 zapisujemy sobie wartosc pomniejszonego j (chyba ze ani razu warunek z while nie zostal spelniony) jako temp i wracamy do poczatku algorytmu ktory  zrownuje j z i (j = i ) i potem przypisuje nowemu j wartosc temp. To po co przypisywac wartosc ktora zaraz jest zmieniona? Gdzie czegoś nie rozumiem (jak wywale te linijke algorytm sie sypie wiec...)
P-140500
carlosmay
» 2015-11-21 19:03:58
Zmienna 'j' po drodze jest dekrementowana.
P-140505
maciek1o3s
Temat założony przez niniejszego użytkownika
» 2015-11-21 19:15:26
A cos wiecej? Ja to widze tak:
1. Mam tablice 5 3 1 4 6 2, tab i = 3, tab j = 3, temp = 3
2. po zmianie mam tablice 3 5 1 4 6 2, tab i = 5, tab j = 3, temp = 3
3. lecimy od nowa, mam tablice 3 5 1 4 6 2, tab i = 1, tab j = 1, temp = 1 (bo na poczatku mamy temp = tab [ j ])
4. po zmianie mam tablice 3 1 5 4 6 2, potem 1 3 5 4 6 2, mam tab i = 5, tab j = 1, temp = 1
5. lecimy od nowa, mam tablice 1 3 5 4 6 2, tab i = 4, tab j = 4, temp = 4 (bo na poczatku mamy temp = tab [ j ])
6. po zmianie mamy tablice 1 3 4 5 6 2, tab i = 5, tab j = 4, temp = 4
7. lecimy od nowa, mam tablice 1 3 4 5 6 2, tab i = 6, tab j = 6, temp = 6 (bo na poczatku mamy temp = tab [ j ])
8. nic sie nie zmienia
9. lecimy od nowa, mam tablice 1 3 4 5 6 2, tab i = 2, tab j = 2, temp = 2 (bo na poczatku mamy temp = tab [ j ])
10. zamieniamy na tablice 1 2 3 4 5 6

Gdzie zle rozumuje? Na koncu algorytmu nadajemy wartosc liczby ktora przenosimy zmiennej temp i wracamy do poczatku algorytmy, gdzie zmienna temp przypisujemy wartosci j=i, powiekszonej o 1 w stosunku do poprzedniego przejscia.
P-140508
carlosmay
» 2015-11-21 19:20:03
W środku 'for' jest pętla 'while', nie 'if' więc wykonuje się więcej niż raz.

edit: prześledź debugerem działanie programu.
P-140509
maciek1o3s
Temat założony przez niniejszego użytkownika
» 2015-11-21 19:51:55
No wiem, że jest while. Nadal wg mnie mamy taką sytuacje:
1. Mam tablice 5 3 1 4 6 2, tab i = 3, tab j = 3, temp = 3
2. po zmianie mam tablice 3 5 1 4 6 2, tab i = 5, tab j = 3, temp = 3
3. lecimy od nowa, mam tablice 3 5 1 4 6 2, tab i = 1, tab j = 1, temp = 1 (bo na poczatku mamy temp = tab [ j ])
4. po zmianie mam tablice 3 1 5 4 6 2, potem 1 3 5 4 6 2, mam tab i = 5, tab j = 1, temp = 1
5. lecimy od nowa, mam tablice 1 3 5 4 6 2, tab i = 4, tab j = 4, temp = 4 (bo na poczatku mamy temp = tab [ j ])
6. po zmianie mamy tablice 1 3 4 5 6 2, tab i = 5, tab j = 4, temp = 4
7. lecimy od nowa, mam tablice 1 3 4 5 6 2, tab i = 6, tab j = 6, temp = 6 (bo na poczatku mamy temp = tab [ j ])
8. nic sie nie zmienia
9. lecimy od nowa, mam tablice 1 3 4 5 6 2, tab i = 2, tab j = 2, temp = 2 (bo na poczatku mamy temp = tab [ j ])
10. zamieniamy na tablice 1 2 3 4 5 6

Gdzie zle rozumuje? Na koncu algorytmu nadajemy wartosc liczby ktora przenosimy zmiennej temp i wracamy do poczatku algorytmy, gdzie zmienna temp przypisujemy wartosci j=i, powiekszonej o 1 w stosunku do poprzedniego przejscia.
P-140510
carlosmay
» 2015-11-21 20:06:06
C/C++
int j = i; // indeks = licznik
int temp = tab[ j ]; // tymczasowa przechowuje tab[1]
while(( j > 0 ) &&( tab[ j - 1 ] > temp ) ) // sprawdza czy tab[0] > tab[1]
{
    tab[ j ] = tab[ j - 1 ]; // jesli tak tab[1] = tab[0]
    j--; // indeks = 0
}
tab[ j ] = temp; // tab[0] = tymczasowa przechowujaca tab[1] sprzed operacji

edit:
jeśli 'while' np. dwa razy z rzędu wykryje (np. tab[1] > tab[2] => tab[2] = tab[1], oraz tab[2] > tab[3]) => tab[3] = tab[2], to dwa razy przypisze
wartości poszczególnych elementów i na koniec
C/C++
tab[ j ] = temp;
 przypisze temp do tab[1] wartość przechowywaną w temp, czyli tab[2] sprzed operacji.
P-140511
maciek1o3s
Temat założony przez niniejszego użytkownika
» 2015-11-21 20:27:59
Dobra jakos zrozumialem, dzieki
P-140515
« 1 »
  Strona 1 z 1