Переполнение стека при оптимизации пузырьковой сортировки

Я просто немного потренировался и попытался отсортировать массив с помощью алгоритма пузырьковой сортировки.
Компилятор не дал мне ни предупреждений, ни ошибок, и он работал хорошо! Сначала вы набираете 10 раз число, а затем программа сортирует их + печатает их.

Код:

#include <iostream>
using namespace std;

void arr_sort(int* array, const int arr_size){

int temp = 0;   //Temporary integer to store (if necessary) the current element
int end = 0;    //Run time condition

while(end++ != arr_size){ // Will loop max. 10 times

for(int i = 0; i < arr_size; i++){

if(array[i] > array[i + 1]){    //If the current element
temp = array[i];    //is bigger than the next

array[i] = array[i + 1];//Change the positions
array[i + 1] = temp;
}
}
}

}

int main(){

int arr_input[10];

for(int i = 0; i < 10;i++)      //The user has to type 10 numbers
cin >> arr_input[i];        //which will be stored in this array

arr_sort(arr_input, 10);        //sorts the array

cout << endl << endl;

for(int i = 0; i < 10; i++)     //Print out the array!
cout << arr_input[i] << ", ";
cout << endl;

return 0;
}

Моя единственная проблема — цикл while в функции arr_sort. Я имею в виду, что сортирует массив до конец имеет то же значение, что и arr_size. Но часто это не нужно так долго. Мой вопрос сейчас … Как я могу улучшить эту функцию? Как я могу проверить, полностью ли отсортирован массив, чтобы цикл while мог остановиться без запуска в другой раз и в другой раз …?

2

Решение

Сразу за циклом for поместите bool и установите его в false. Внутри блока подкачки установите для bool значение true. После цикла for проверьте значение логического значения, и, если оно все еще равно false, перестановки не были выполнены, поэтому массив отсортирован, поэтому выйдите из цикла while.

while(end++ != arr_size){ // Will loop max. 10 times

bool swapped = false;
for(int i = 0; i < arr_size; i++){

if(array[i] > array[i + 1]){    //If the current element
temp = array[i];    //is bigger than the next

array[i] = array[i + 1];//Change the positions
array[i + 1] = temp;
swapped = true;
}
}
if (!swapped) break;
}
3

Другие решения

Перед вашим for цикл, предположим, что это отсортировано:

bool sorted = true;

В вашем if Statement`, запишите, что он не отсортирован:

sorted = false;

После вашего for loop`, вернуть, если не было доказательств того, что он не отсортирован:

if ( sorted ) return;
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector