我正在尝试通过计算元素来对数组进行排序,然后再次对它们进行排序"counting sort"

I'm trying to sort an array by counting the elements and then sort them again "counting sort"

本文关键字:排序 然后 sort counting 数组 元素 计算      更新时间:2023-10-16

我正在尝试通过制作另一个数组来对数组进行排序,该数组的大小为我要排序的数组中的最大数字,然后每次我找到数字时,I ++该数字的索引。例如:主数组是 {5,3,8,1,2,3}另一个数组 {0,1,1,2,0,1,0,0,1}那么我的排序数组将像{1,2,3,3,5,8}我不知道为什么我的代码不起作用,请问吗?

#include <iostream>
using namespace std;
int findmax(int a[], int size){
int max = a[0];
for (int i = 0; i < size; i++)
    if (max < a[i])
        max = a[i];
return max;
}
 void sort(int a[], int n){
 int max = findmax(a, n);
int *arr;
arr = new int[max+1];
for (int i = 0; i < n; i++){
    arr[a[i]]++;
}
for (int k = 0; k < n;){
    for (int l = 0; l <= max; l++)  {
        while (arr[l] != 0){
            a[k] = l;
            arr[l]--;
            k++;
        }
    }
}

真正应该做的是在调试器中逐行单步执行代码。这样,您将轻松查看问题所在。

但既然我开始写这篇文章,我不妨把它作为答案发布。

问题是您分配并分配给arr的数组未初始化,其内容不确定。使用未初始化的数据是未定义的行为

真正发生的事情是,您分配的数据似乎是随机的,而且很可能没有一个是零的。这导致你的计数都是错误的。

解决方案是在计算值之前清除您分配的内存:

std::fill(arr, arr + max + 1, 0);
相关文章: