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: 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...) |
|
carlosmay |
» 2015-11-21 19:03:58 Zmienna 'j' po drodze jest dekrementowana. |
|
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. |
|
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. |
|
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. |
|
carlosmay |
» 2015-11-21 20:06:06 int j = i; int temp = tab[ j ]; while(( j > 0 ) &&( tab[ j - 1 ] > temp ) ) { tab[ j ] = tab[ j - 1 ]; j--; } tab[ j ] = temp;
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 przypisze temp do tab[1] wartość przechowywaną w temp, czyli tab[2] sprzed operacji. |
|
maciek1o3s Temat założony przez niniejszego użytkownika |
» 2015-11-21 20:27:59 Dobra jakos zrozumialem, dzieki |
|
« 1 » |