Как сделать запоминание, проводился ли на данном проходе какой-нибудь обмен элементов

На примере массива из 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;
}
→ Ссылка