В данной статье будет затронута весьма популярная тема в области программирования, а именно Сортировка массива в C++. Здесь приведено несколько способов сортировки вместе с примерами.
Сортировка выбором
Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке.
template<typename T>
void select_sort(T a[], int size)
{
int k;
T x;
for(int i = 0; i < size; ++i) // i - номер текущего шага
{
k = i;
x = a[i];
for(int j = i + 1; j < size; ++j)// цикл выбора наименьшего элемента
if ( a[j] < x )
{
k = j; // k - индекс наименьшего элемента
x = a[j];
}
a[k] = a[i];
a[i] = x; // меняем местами наименьший с a[i]
}
}
Если входная последовательность почти упорядочена, то сравнений будет столько же, значит алгоритм ведет себя неестественно.
Сортировка пузырьком
Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.
template<typename T>
void bubble_sort(T a[], int size) {
T x;
for(int i = 0; i < size; ++i) // i - номер прохода
{
for(int j = size - 1; j > i; --j) // внутренний цикл прохода
{
if ( a[j-1] > a[j] )
{
x = a[j-1];
a[j-1] = a[j];
a[j] = x;
}
}
}
}
Дополнительная память, очевидно, не требуется. Поведение усовершенствованного (но не начального) метода довольно естественное, почти отсортированный массив будет отсортирован намного быстрее случайного. Сортировка пузырьком устойчива, однако шейкер-сортировка утрачивает это качество.
На практике метод пузырька, даже с улучшениями, работает слишком медленно. А потому — почти не применяется.
Сортировка вставками
Сортировка простыми вставками в чем-то похожа на вышеизложенные методы.
template<typename T>
void insert_sort(T a[], int size)
{
T x;
int j;
for (int i = 0; i < size; ++i)
{
x = a[i];
// поиск места элемента в готовой последовательности
for (j = i - 1; j >= 0 && a[j] > x; --j)
a[j+1] = a[j]; // сдвигаем элемент направо, пока не дошли
// место найдено, вставить элемент
a[j+1] = x;
}
}
Аналогично сортировке выбором, среднее, а также худшее число сравнений и пересылок оцениваются как Theta(n2), дополнительная память при этом не используется.
Хорошим показателем сортировки является весьма естественное поведение: почти отсортированный массив будет досортирован очень быстро. Это, вкупе с устойчивостью алгоритма, делает метод хорошим выбором в соответствующих ситуациях.
Ну Собственно проверка
template<typename T>
void out_arr(T arr[], int size)
{
for(int i = 0; i < size; ++i)
std::cout << arr[i] << " ";
}
int main()
{
int arr0[6] = {9,5,4,6,2,1};
int arr1[6] = {9,5,4,6,2,1};
int arr2[6] = {9,5,4,6,2,1};
select_sort(arr0, 6);
bubble_sort(arr1, 6);
insert_sort(arr2, 6);
out_arr(arr0, 6); std::cout << '\n';
out_arr(arr1, 6); std::cout << '\n';
out_arr(arr2, 6); std::cout << '\n';
return 0;
}
Имхо лучше юзать std::sort().
#include <iostream>
#include <algorithm>
#include <functional>
int main()
{
int arr[] = {9,8,7,6,5,4,3,2,1};
int size = sizeof(arr)/sizeof(int);
std::sort(arr, arr + size);
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout," "));
std::cout << '\n';
std::sort(arr, arr + size,std::greater<int>());
std::copy(arr, arr + size, std::ostream_iterator<int>(std::cout," "));
std::cout << '\n';
return 0;
}
PS.
Если вы новичок,и не понимаете,что такое template или не проходили этого, то есть два способа справиться с этой проблемой:
1. Загуглить «Шаблоны С++. Материал простой,разберетесь»
2. Убрать эту надпись,а в прототипе букву T заменить типом вашего массива (int, double,..etc)
Comments ( 0 )