Nadesłany przez Jan Wojciechowski, 20 marca 2012 18:11
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
quicksort.cpp:
//QuickSort - sortowanie szybkie
//Jan Wojceichowski
//www.algorytm.org
#include <iostream>
#include <utility>
#include <algorithm>
#include <functional>
// Podział danych na dwie części.
template<typename Iter, typename Compare>
std::pair<Iter, Iter> quickSortPartition(Iter first, Iter last, Compare compare) {
Iter ll = first + ((last - first) / 2), le = ll + 1, lg = le, lu = ll;
while(lg != last) {
if(compare(*lg, *ll)) {
std::swap(*lg, *le);
std::swap(*le, *ll);
++ll;
++le;
} else if(compare(*ll, *lg)) {
} else {
std::swap(*lg, *le);
++le;
}
++lg;
}
while(lu != first) {
--lu;
if(compare(*lu, *ll)) {
} else if(compare(*ll, *lu)) {
--le;
--ll;
std::swap(*lu, *ll);
std::swap(*ll, *le);
} else {
--ll;
std::swap(*lu, *ll);
}
}
return std::make_pair(ll, le);
}
// Sortowanie z własną funkcją porównującą.
template<typename Iter, typename Compare>
void quickSort(Iter first, Iter last, Compare compare) {
if(last - first < 2) {
return;
}
while(1 < last - first) {
std::pair<Iter, Iter> div = quickSortPartition(first, last, compare);
if(div.first - first < last - div.second) {
// Pętla kontynuuje pracę na drugiej części.
quickSort(first, div.first, compare);
first = div.second;
} else {
// Pętla kontynuuje pracę na pierwszej części.
quickSort(div.second, last, compare);
last = div.first;
}
}
}
// Sortowanie z użyciem operatora '<'.
template<typename Iter>
void quickSort(Iter first, Iter last) {
return quickSort(first, last, std::less<std::iterator_traits<Iter>::value_type>());
}
bool greaterThan(double a, double b) {
return a > b;
}
int main() {
std::cout << "Ile liczb checsz posortowac? ";
unsigned int count;
std::cin >> count;
std::cout << "Podaj " << count << " liczb rzeczywistych." << std::endl;
double* data = new double[count];
for(unsigned int i = 0; i < count; ++i) {
std::cin >> data[i];
std::cin.ignore();
}
quickSort(data, data + count);
std::cout << "Liczby posortowane rosnaco:" << std::endl;
for(unsigned int i = 0; i < count; ++i) {
std::cout << data[i] << (i + 1 < count ? " " : "\n");
}
quickSort(data, data + count, greaterThan);
std::cout << "Liczby posortowane malejaco:" << std::endl;
for(unsigned int i = 0; i < count; ++i) {
std::cout << data[i] << (i + 1 < count ? " " : "\n");
}
delete[] data;
data = NULL;
std::cout << "Nacisnij ENTER." << std::endl;
::getchar();
return 0;
}

