Sortowanie szybkie


Sortowanie szybkie (quicksort)
Algorytm sortowania szybkiego opiera się na strategii "dziel i zwyciężaj"
(ang. divide and conquer), którą możemy krótko scharakteryzować w trzech
punktach:
1. DZIEL - problem główny zostaje podzielony na podproblemy
2. ZWYCIŻAJ - znajdujemy rozwiązanie podproblemów
3. POACZ - rozwiązania podproblemów zostają połączone w rozwiązanie
problemu głównego
Idea sortowania szybkiego jest następująca:
DZIEL : najpierw sortowany zbiór dzielimy na dwie części w taki sposób, aby
wszystkie elementy leżące w pierwszej części(zwanej lewą
partycją) były mniejsze lub równe od wszystkich elementów drugiej
części zbioru (zwanej prawą partycją).
ZWYCIŻAJ : każdą z partycji sortujemy rekurencyjnie tym samym algorytmem.
POACZ : połączenie tych dwóch partycji w jeden zbiór daje w wyniku zbiór
posortowany.
Specyfikacja problemu
Sortuj_szybko(lewy, prawy)
Dane wejściowe
d[ ] - Zbiór zawierający elementy do posortowania. Zakres indeksów elementów
jest dowolny.
lewy - indeks pierwszego elementu w zbiorze, lewy " C
prawy - indeks ostatniego elementu w zbiorze, prawy " C
Dane wyjściowe
d[ ] - Zbiór zawierający elementy posortowane rosnąco
Zmienne pomocnicze
piwot - element podziałowy
i, j -
indeksy, i, j " C
Lista kroków
K01: i ! [ lewy + prawy ]
2
K02: piwot ! d[i]; d[i] ! d[prawy]; j ! lewy
K03: Dla i = lewy, lewy + 1, ..., prawy - 1: wykonuj K04...K05
K04: Jeśli d[i] e" piwot, to wykonaj kolejny obieg pętli K03
K05: d[i] "! d[j]; j ! j + 1
K06: d[prawy] ! d[j]; d[j] ! piwot
K07: Jeśli lewy < j - 1, to Sortuj_szybko(lewy, j - 1)
K08: Jeśli j + 1 < prawy, to Sortuj_szybko(j + 1, prawy)
K09: Zakończ
Algorytm sortowania szybkiego wywołujemy podając za lewy indeks
pierwszego elementu zbioru, a za prawy indeks elementu
ostatniego (czyliSortuj_szybko(1,n)). Zakres indeksów jest dowolny - dzięki
temu ten sam algorytm może również sortować fragment zbioru, co
wykorzystujemy przy sortowaniu wyliczonych partycji.
Schemat blokowy
program Quick_Sort; #include
const N = 20; // Liczebność zbioru. #include
var #include
d : array[1..N] of integer; #include
// Procedura sortowania szybkiego using namespace std;
procedure Sortuj_szybko(lewy, prawy : const int N = 20; // Liczebność zbioru.
integer);
int d[N];
var
i,j,piwot,x : integer;
// Procedura sortowania szybkiego
begin
void Sortuj_szybko(int lewy, int prawy)
i := (lewy + prawy) div 2;
{
piwot := d[i]; d[i] := d[prawy];
int i,j,piwot;
j := lewy;
i = (lewy + prawy) / 2;
for i := lewy to prawy - 1 do
piwot = d[i]; d[i] = d[prawy];
if d[i] < piwot then
for(j = i = lewy; i < prawy; i++)
begin
if(d[i] < piwot)
x := d[i]; d[i] := d[j]; d[j] := x;
{
inc(j);
swap(d[i], d[j]);
end;
j++;
d[prawy] := d[j]; d[j] := piwot;
}
if lewy < j - 1 then
d[prawy] = d[j]; d[j] = piwot;
Sortuj_szybko(lewy, j - 1);
if(lewy < j - 1) Sortuj_szybko(lewy,
if j + 1 < prawy then Sortuj_szybko(j
j - 1);
+ 1, prawy);
if(j + 1 < prawy) Sortuj_szybko(j +
end;
1, prawy);
// Program główny
}
var
// Program główny
i : integer;
int main()
begin
{
writeln(' Sortowanie szybkie');
int i;
// Najpierw wypełniamy tablicę d[]
srand((unsigned)time(NULL));
//liczbami pseudolosowymi
// Najpierw wypełniamy tablicę d[]
// a następnie wyświetlamy jej
//liczbami pseudolosowymi
//zawartość
// a następnie wyświetlamy jej
randomize;
//zawartość
for i := 1 to N do d[i] :=
for(i = 0;irandom(100);
for(i = 0; i < N; i++) cout <<
writeln('Przed sortowaniem:');
setw(4) << d[i];
writeln;
cout << endl;
for i := 1 to N do write(d[i] : 4);
// Sortujemy
writeln;
Sortuj_szybko(0,N - 1);
// Sortujemy
// Wyświetlamy wynik sortowania
Sortuj_szybko(1,N);
cout << "Po sortowaniu:\n\n";
// Wyświetlamy wynik sortowania
for(i = 0; i < N; i++) cout <<
writeln('Po sortowaniu:'); writeln;
setw(4) << d[i];
for i := 1 to N do write(d[i] : 4);
cout << endl;
writeln;
return 0;
writeln('Nacisnij Enter...');
}
readln; end.


Wyszukiwarka

Podobne podstrony:
sortowanie szybkie
APP Sortowanie Szybkie
Lekcja sortowanie
Szybki kurs Adobe Photoshop
Programowanie w jezyku C Szybki start procss
AiSD w4 sortowanie2
Crocker Zbyt szybkie wycofanie oddziałów z Iraku to błąd (24 01 2009)
PHP6 i MySQL 5 Dynamiczne strony WWW Szybki start ph6ms5
Szybkie ciasto ze śliwkami
Ukraina będzie mieć szybkie pociągi na Euro 2012, a Polska – figę z makiem
szybkie pokonywanie zakrętów

więcej podobnych podstron