Как сделать запоминание, проводился ли на данном проходе какой-нибудь обмен элементов
На примере массива из 10 элементов показать пошаговое выполнение шейкер- сортировки. Выполнить поэтапно три возможных варианта улучшения (запоминание, проводился ли на данном проходе какой-нибудь обмен элементов; запоминание индекса последнего обмена, изменение направления проходов, следующих друг за другом;)
#include <iostream>
#include <cstdlib>
#include <time.h>
#define N 10
using namespace std;
void print(int arr[], int size)
{
for (int i = 0; i < size; i++)
cout << arr[i] << " ";
cout << endl;
}
int main(){
srand(time(NULL));
int* array;
array = new int[N];
for (int i = 0; i < N; i++) {
array[i] = rand();
cout << array[i] << " ";
}
int temp;
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N - i - 1; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
print(array, N);
}
}
}
cout << endl;
cout << "Sorted massiv" << endl;
print(array, N);
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Заведите флаг - был ли обмен - и взводите его при наличии обмена. Не было - останавливайте работу.
for (int i = 0; i < N - 1; i++) {
int flag = 0;
for (int j = 0; j < N - i - 1; j++) {
if (array[j] > array[j + 1]) {
flag = 1;
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
print(array, N);
}
}
if (flag == 0)
break;
}