為什么這個計數排序不作業?
#include <bit/stdc .h>
using namespace std;
void countSort(vector<int> & input)
{
int max = *max_element(input.begin(), input.end() 。)
vector<int> counter(max 1)。
vector<int> output;
for(int i = 0; i < max 1; i)
{
counter[i] = 0;
}
for(int i = 0; i < input.size(); i)
{
counter[input[i]] 。
}
for(int i = 0; i < max 1; i)
{
while(counter[i] > 0)
{
output.push_back(counter[input[i]])。
counter[i]--。
}
}
}
int main()
{
vector<int> array = {9, 8, 9, 1, 5, 7, 1, 2};
countSort(array)。
當我運行這段代碼時,它只是給我發了一條錯誤資訊,
行程結束,退出代碼1073741819 (0xC0000005)
但是我不明白錯誤在哪里。
uj5u.com熱心網友回復:
主要的問題是在你的push_back。
output.push_back(counter[input[i]])。
它應該是:
output.push_back(i)。
你也沒有保存排序后的output陣列的結果。你可以回傳它或者替換input。在我下面的例子中,我正在替換input.
另一個潛在的問題是,你正在對有符號整數進行排序,所以你應該期待負數。如果你現在得到一個負值,你將會訪問你的counter陣列,超出了邊界。
一個簡單的補救措施是首先檢查min和max值,并從counter的所有下標中減去min。
示例:
#include <algorithm>
#include <iostream>
#include <vector>
void countSort(std::vector<int> & input){
auto[minit, maxit] = std::minmax_element(input.begin(), input.end())。
auto min = *minit;
auto max = *maxit;
std::vector<int> counter(max - min 1)。
for(auto in : input) counter[in-min]; // -min offset。
input.clear(); //清除它以填充排序后的值。
for(int i = min; i <= max; i) {
for(;counter[i-min] > 0; --counter[i-min]) { //-min offset
input.push_back(i)。
}
}
}
int main() {
std:: vector<int> array = {9, 8, 9, 1, 5, 7, 1, 2, 10]; //負值增加。
countSort(陣列)。
for(auto v : array) std::cout << v << ' '/span>;
}
輸出:
10 1 1 2 5 7 8 9 9
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325793.html
標籤:
上一篇:2個組件上的多個資料源
