Cześć. Jako projekt dodatkowy do szkoły wpadłem na pomysł napisania algorytmu sortującego. No i dodatkowo chciałem przy tym się czegoś nauczyć, a jako że mam jako jedno z wymagań znajomość STL, to skleciłem takie coś. Tyle że, niewiem jak i czy wogóle da się operować arytmetycznie na iteratorach. Skoro to nie typ, a wskaźnik, to co można z tym faktem zrobić? Chodzi mi tylko o żeby zmienić indeks tablicy na który wskazuje iterator. Na upartego mógłbym zrobić zwykłe pętle, a po prostu za każdym razem inkrementować wskaźnik, ale takie rozwiązanie wydaje mi się "brudne".
Pokrótce omówię jak działa ten algorytm. Na wejściu jest nieposortowana lista np. intów. Szukamy w całym zbiorze największej i najmniejszej wartości. Największą zamieniamy indeksem z ostatnią w zbiorze, a najmniejszą z pierwszym. Następnie zbiór do przeszukania zmniejszamy o tą ostatnią i pierwszą liczbę. Powtarzamy ten proces n/2 lub (jeżeli n nie jest parzysta) (n-1)/2 gdzie n jest liczbą indeksów.
Możecie również dawać rady jak można coś lepiej napisać.
Z góry dzięki.
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <iterator>
using namespace std;
template <class T>
vector<T> sort(vector<T> input) {
typename vector<T>::iterator largestIndex = input.begin(), smallestIndex = input.begin(), i, j, minus = input.begin();
if ((input.end() - 1) % 2 != 0)
++minus;
//Sort
for (i = input.begin(); i != input.end() - minus; ++i) {
largestIndex = i;
smallestIndex = i;
for (j = i; j != input.end() - i; ++j) {
if (*j > * largestIndex)
largestIndex = j;
if (*j < *smallestIndex)
smallestIndex = j;
}
swap(*i, *smallestIndex);
swap(*(input.end() - i - 1), *largestIndex);
}
return input;
}
int main()
{
vector<int> array = { 3, 8, 2, 9, 6, 5, 4, 12};
array = sort<int>(array);
for (vector<int>::iterator m = array.begin(); m != array.end(); ++m) cout << " " << *m;
return 0;
}