algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Sortowanie szybkie (quicksort) - Implementacja w C/C++
Ocena użytkownikóww: *****  / 11
SłabyŚwietny
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;
}
Dodaj komentarz