Почему мой алгоритм сортировки подсчета вообще не сортирует? - PullRequest
0 голосов
/ 18 марта 2020
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void SortCount(vector<int>& vec){
    int max_el = *max_element(vec.begin(), vec.end());

    vector<int> C(max_el+1, 0);
    vector<int> B(vec.size(), 0);

    for(int i = 0; i < vec.size(); i++){
        C[vec[i]] = C[vec[i]] + 1;
    }
    for(int i = 1; i <= vec.size(); i++){
        C[i] = C[i] + C[i - 1];
    }
    for(int i = 0; i < vec.size(); i++ ) {
        B[C[vec[i]] - 1] = vec[i];
        C[vec[i]] = C[vec[i]] - 1;
    }
    for(int i=0; i<vec.size(); i++){
        vec[i] = B[i];
    }
}

int main() {

    vector<int> vec {5,2,43,31,67,311};
    SortCount(vec);

    for (size_t i=0;  i <vec.size();  i++) {
        cout<<vec[i]<<" ";
    }

    return 0;
}


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

Редактировать: я добавил основную функцию

1 Ответ

4 голосов
/ 19 марта 2020

Ваша итерация по массиву count имеет неправильные границы:

//for(int i = 1; i <= vec.size(); i++) { <--wrong
for(int i = 1; i < C.size(); i++) {
    C[i] = C[i] + C[i - 1];
}

Также вы должны привыкнуть использовать std::size_t в качестве типа для индекса вместо int. int слишком мал и подписан, поэтому он не подходит для индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...