сортировка — c ++ не может заставить сортировку выбора работать должным образом

Я пытаюсь понять алгоритмы сортировки, поэтому на основе гугл-примеров / объяснений я написал приведенный ниже код. Код работает 80% времени. Время от времени это не сортирует должным образом, и я не могу понять, почему.

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void setArray( int *, const int & );
void selectionSorting( int *, const int & );

int main()
{
int numOfElem;
cout << "Num of array elements: ";
cin >> numOfElem;
cout << '\n';

int array[numOfElem];
setArray(array, numOfElem);

selectionSorting(array, numOfElem);

cout << '\n';
return 0;
}

void setArray( int *array, const int & numOfElem ){
srand(time(0));
cout << "Original array: " << '\n';
for (int i=0; i<numOfElem; i++){
array[i] = rand()%30;
cout << array[i] << ' ';
}
cout << '\n';
}

void selectionSorting( int *array, const int &numOfElem ){
int eff_size, swap;
int maxpos = 0;
for (eff_size = numOfElem; eff_size>1; eff_size--){
// loop searching for a position of largest number in the array
for (int i=0; i<eff_size; i++){
maxpos = array[i] > array[maxpos] ? i : maxpos;
}
swap = array[maxpos];
array[maxpos] = array[eff_size-1];
array[eff_size-1] = swap;
}
cout << "Selection Sorting: " << '\n';
for (int i=0; i<numOfElem; i++){
cout << array[i] << ' ';
}
}

Пример вывода:

Num of array elements: 5

Original array:
7 17 1 12 25
Selection Sorting:
1 7 17 25 12

Я не вижу какой-либо закономерности сбоя сортировки — она ​​происходит в разных местах, если есть повторяющиеся числа, независимо от того, сколько чисел я предоставляю и т. Д.

1

Решение

На каждой итерации внешнего цикла (более eff_size) вы должны восстановить maxpos до 0. В противном случае у вас есть шанс, что maxpos выходит из сортируемой эффективной части (это происходит, если максимальный элемент является последним в эффективной части, т.е. если maxpos==effsize).

4

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


По вопросам рекламы [email protected]