Доброго времени суток. Есть такая задача:
Сгенерировать массив и вывести его на экран. Сделать сортировку элементов: Шейкерный. Направление сортировки: по убыванию. Метод поиска: бинарный.
У меня есть следующий код:
#include <iostream>
using namespace std;
//ф-ция для обмена значений ячеек
void swapEl(int *arr, int i)
{
int buff;
buff = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = buff;
}
//ф-ция "шейкер"-сортировки
void myShakerSort(int *arr, int size)
{
int leftMark = 1;
int rightMark = size - 1;
while (leftMark <= rightMark)
{
for (int i = rightMark; i >= leftMark; i--)
if (arr[i - 1] > arr[i]) swapEl(arr, i);
leftMark++;
for (int i = leftMark; i <= rightMark; i++)
if (arr[i - 1] > arr[i]) swapEl(arr, i);
rightMark--;
cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
}
}
int main()
{
setlocale(LC_ALL, "rus");
int size = 0;
cout << "Размер массива: ";
cin >> size;
int *A = new int[size];
for (int k = 0; k < size; k++)
{
A[k] = size - k; // запись значений по убыванию
cout << A[k] << " | ";
}
myShakerSort(A, size); // сортировка
cout << "\nМассив после сортировки:\n";
for (int k = 0; k < size; k++)
{
cout << A[k] << " | ";
}
cout << endl;
system("PAUSE");
}
Как его переделать под эти условия?
Чтобы сортировать по убыванию просто нужно поменять знак сравнения
void myShakerSort(int *arr, int size)
{
int leftMark = 1;
int rightMark = size - 1;
while (leftMark <= rightMark)
{
for (int i = rightMark; i >= leftMark; --i)
if (arr[i - 1] < arr[i]) swapEl(arr, i);
++leftMark;
for (int i = leftMark; i <= rightMark; ++i)
if (arr[i - 1] < arr[i]) swapEl(arr, i);
--rightMark;
}
}
P.S. и вместо постинкрементов всегда лучше использовать преинкремент, если это не помеха программе. В данном случаи у вас нет необходимости в использовании постинкрементов
Как уже ответили, достаточно изменить оператор сравнения.
От себя дополню, что функция swapEl(...) не нужна, т.к. в стандартной библиотеке она уже реализована: http://www.cplusplus.com/reference/algorithm/swap/
Причем в стандарте С++11 работает через move-семантику.
В итоге весь код сводится к этому:
#include <iostream>
using namespace std;
//ф-ция "шейкер"-сортировки
void myShakerSort(int *arr, int size)
{
int leftMark = 1;
int rightMark = size - 1;
while (leftMark <= rightMark)
{
for (int i = rightMark; i >= leftMark; i--)
if (arr[i - 1] < arr[i])
swap(arr[i], arr[i - 1]);
leftMark++;
for (int i = leftMark; i <= rightMark; i++)
if (arr[i - 1] < arr[i])
swap(arr[i], arr[i - 1]);
rightMark--;
cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
}
}
int main()
{
setlocale(LC_ALL, "rus");
int size = 0;
cout << "Размер массива: ";
cin >> size;
int *A = new int[size];
for (int k = 0; k < size; k++)
{
A[k] = size - k; // запись значений по убыванию
cout << A[k] << " | ";
}
myShakerSort(A, size); // сортировка
cout << "\nМассив после сортировки:\n";
for (int k = 0; k < size; k++)
{
cout << A[k] << " | ";
}
cout << endl;
system("PAUSE");
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости