在这里我写了一个对数组进行排序的代码,但有些问题,我不明白出了什么问题,请解释一下。
#include <iostream>
using namespace std;
void printArray(int array[], int length){
for (int i = 0; i < length; i++)
cout << array[i];
cout << endl;
}
/* min and max values which are the first and the last elements of the array*/
void countingSort(int array[], int length){
int max = array[0];
int min = array[0];
int count[max - min + 1] = {};
int sum = 0;
for (int i = 0; i < length; i++){
if (array[i] > max)
max = array[i];
else
min = array[i];
}
/* the new array with indexes*/
for (int i = 0; i < max - min + 1; i++){
count[array[i]]++;
}
for (int j = 0;j < max - min;j++)
{
while(count[j] --)
array[sum++] = j;
}
}
int main() {
int array[] = {4,7,8,9,10,6};
countingSort(array, 6);
printArray(array,6);
return 0;
}
它必须通过索引对数组进行排序
int max = array[0];
这会max
数组的第一个元素,而不是最后一个元素。因此,当这行代码运行时:
int count[max - min + 1] = {};
count
的大小始终为 1。
将其更改为:
int max = array[length - 1];
此外,C++不支持可变长度数组;只有一些编译器扩展了对它的支持。在编译这些编译器时,数组的大小必须是固定常量。如果要使用 VLA,请改用std::vector
。
函数countingSort
大约有 50% 的行有错误。
你的count
数组总是只有一个(array[0] - array[0] + 1
)元素。 这意味着在读取或写入索引 0 之外时,您有未定义的行为。
(可变长度数组是非标准扩展。了解如何使用std::vector
.)
直到确定最大值和最小值的循环完成之后,您才知道最大值和最小值。
在该循环之后移动数组声明。
此外,您需要修复该循环,因为它不一定找到最小值(array[i] <= max
并不意味着您已经找到了最小值)。
例如,您将拥有示例输入的min == 6
。
计数循环需要
for (int i = 0; i < length; i++)
因为你正在循环array
,它有length
元素。
您需要调整计数器,因为最小值对应于索引 0,但不一定为 0:
count[array[i] - min]++;
而"结果收集"循环应该是
for (int j = 0;j < max - min + 1;j++)
因为count
有max - min + 1
元素,你需要
array[sum++] = min + j;
因为第一个元素计算min
出现次数,而不是零。
我认为这涵盖了你的大部分问题。
(还有一个旁注:"sum"是一个非常奇特的名字,指的是不是总和的东西。
#include <iostream>
using namespace std;
void printArray(int array[], int length){
for (int i = 0; i < length; i++)
cout << array[i];
cout << endl;
}
void countingSort(int array[], int length){
int max = array[length - 1];
int min = array[0];
int count[100] = {};
int sum = 0;
for (int i = 0; i < length; i++){
if( array[i] > max)
max = array[i];
else
min = array[i];
}
for (int i = 0; i < length; i++){
count[array[i] - min]++;
}
for (int j = 0;j < max - min + 1;j++)
{
while(count[j] --)
array[sum++] = min + j;
}
}
int main() {
int array[] = {4,7,8,9,10,6};
countingSort(array, 6);
printArray(array,6);
return 0;
}
我在某些地方改进了它,但它没有给我一个输出 6,7,8,9,10,6...