Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
ProblemDane wejściowe należy posortować rosnąco, wykorzystując listę jednokierunkową. Do sortowania należy wykorzystać algorytm sortujący przez wstawianie. |
Sortowanie przez wstawianie (ang. insertion sort)
jest algorytmem klasy
K01: Twórz pustą listę L K02: Dodaj do L dwóch strażników K03: Dopóki na wejściu są dane, wykonuj kroki K04…K10 K04: Czytaj v ; odczytujemy element do sortowania K05: p ← L ; w p pierwszy strażnik K06: Dopóki v > p→next→data, ; szukamy na liście pierwszego elementu, wykonuj p ← p→next ; który nie jest mniejszy od v K07: Twórz nowy element e ; e wstawiamy przed znaleziony element K08: e→data ← v K09: e→next ← p→next K10: p→next ← e K11: p ← L→next ; wyprowadzamy zawartość listy pomijając strażników K12 Dopóki p→next ≠ nil, wykonuj kroki K13…K14 K13: Pisz p→data K14: p ← p→next K15: Usuń listę L K16: Zakończ
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program odczytuje ciąg liczb całkowitych ze standardowego wejścia. Pierwsza liczba określa ilość pozostałych liczb. Liczby do odczytu znajdują się w następnym wierszu. Liczby zostają posortowane rosnąco i wyprowadzone na wyjście.
Przykładowe dane wejściowe:
25 -1 2 9 17 -3 15 4 6 -9 16 8 1 10 -2 3 12 20 14 18 -5 11 13 7 19 5
Pascal// Sortowanie przez wstawianie // z listą jednokierunkową // Data: 21.08.2012 // (C)2020 mgr Jerzy Wałaszek //---------------------------- program listinsort; type // typ elementu listy jednokierunkowej PSLel = ^SLel; SLel = record next : PSLel; data : integer; end; var L : PSLel; // wskaźnik początku listy e, p : PSLel; // wskaźniki elementów listy n : integer; // liczba elementów do posortowania v : integer; // wartość elementu i : integer; // licznik elementów begin new(L); // tworzymy pierwszego strażnika new(L^.next); // tworzymy drugiego strażnika L^.next^.next := nil; // drugi strażnik jest ostatni L^.next^.data := MAXINT; // wartość drugiego strażnika read(n); // odczytujemy liczbę elementów for i := 1 to n do begin read(v); // czytamy element p := L; // p ustawiamy na pierwszego strażnika while v > p^.next^.data do // szukamy miejsca wstawienia p := p^.next; new(e); // tworzymy nowy element e^.data := v; // inicjujemy element e^.next := p^.next; p^.next := e; // element wstawiamy do listy L end; p := L^.next; // listę przesyłamy na wyjście while p^.next <> nil do begin write(p^.data, ' '); p := p^.next; end; writeln; while L <> nil do // usuwamy listę z pamięci begin e := L; L := L^.next; dispose(e); end; end. |
// Sortowanie przez wstawianie // z listą jednokierunkową // Data: 21.08.2012 // (C)2020 mgr Jerzy Wałaszek //---------------------------- #include <iostream> using namespace std; struct SLel // typ elementu listy { SLel * next; int data; }; int main() { SLel * L; // wskaźnik początku listy SLel * e, * p; // wskaźniki elementów listy int n; // liczba elementów // do posortowania int v; // wartość elementu L = new SLel; // tworzymy pierwszego // strażnika L->next = new SLel; // tworzymy drugiego // strażnika L->next->next = NULL; // drugi strażnik jest // ostatni na liście L->next->data = 2147483647; // wartość drugiego // strażnika cin >> n; // odczytujemy liczbę elementów for(int i = 0; i < n; i++) { cin >> v; // czytamy element // szukamy miejsca wstawienia for(p = L; v > p->next->data; p = p->next) e = new SLel; // tworzymy nowy element e->data = v; // inicjujemy element e->next = p->next; p->next = e; // element wstawiamy do listy L } // listę przesyłamy na wyjście for(p = L->next; p->next; p = p->next) cout << p->data << " "; cout << endl; while(L) // usuwamy listę z pamięci { e = L; L = L->next; delete e; } return 0; } |
Basic' Sortowanie przez wstawianie ' z listą jednokierunkową ' Data: 21.08.2012 ' (C)2020 mgr Jerzy Wałaszek '---------------------------- Type SLel ' typ elementu listy next As SLel Ptr data As Integer End Type Dim L As SLel Ptr ' wskaźnik początku listy Dim As SLel Ptr e, p ' wskaźniki elementów Dim n As Integer ' liczba elementów ' do posortowania Dim v As Integer ' wartość elementu Dim i As Integer ' licznik elementów Open Cons For Input As #1 L = new SLel ' tworzymy pierwszego strażnika L->next = new SLel ' tworzymy drugiego ' strażnika L->next->next = 0 ' drugi strażnik jest ' ostatni na liście L->next->data = 2147483647 ' wartość drugiego ' strażnika Input #1, n ' odczytujemy liczbę elementów for i = 1 To n Input #1, v ' czytamy element p = L ' szukamy miejsca wstawienia While v > p->next->Data p = p->Next Wend e = new SLel ' tworzymy nowy element e->data = v ' inicjujemy element e->next = p->Next p->next = e ' element wstawiamy do listy L Next Close #1 p = L->Next ' listę przesyłamy na wyjście While p->Next Print Using "& ";p->Data; p = p->Next Wend Print While L ' usuwamy listę z pamięci e = L L = L->Next Delete e Wend End |
Python (dodatek) |
# Sortowanie przez wstawianie # z listą jednokierunkową # Data: 28.05.2024 # (C)2024 mgr Jerzy Wałaszek #---------------------------- # klasa elementu listy #--------------------- class SLel: def __init__(self, data): self.next = None self.data = data # tworzymy pierwszego strażnika sl = SLel(0) # tworzymy drugiego strażnika sl.next = SLel(2147483647) # odczytujemy liczbę elementów n = int(input()) # czytamy elementy do tablicy ev = input().split() # czytamy elementy i sortujemy for i in range(n): v = int(ev[i]) # szukamy miejsca wstawienia p = sl while v > p.next.data: p = p.next e = SLel(v) # tworzymy nowy element e.next = p.next p.next = e # element wstawiamy do listy L # listę przesyłamy na wyjście p = sl.next while p.next: print(p.data, end=" ") p = p.next print() |
Wynik: |
25 -1 2 9 17 -3 15 4 6 -9 16 8 1 10 -2 3 12 20 14 18 -5 11 13 7 19 5 -9 -5 -3 -2 -1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.