谁可以帮助解释我的代码中出了什么问题.计算C ++中的数组



在这里我写了一个对数组进行排序的代码,但有些问题,我不明白出了什么问题,请解释一下。

#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++)

因为countmax - 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...

最新更新