基数排序在输出中显示错误值
Radix Sort showing wrong values in the output
我正在学习 dsa,我试图在 c 中实现基数排序。我用这个 tutorial from programiz.
我实现了它,但是他们使用的数字数组得到了正确排序,但是当我使用不同的数组时,它显示了一些垃圾值。
当我插入这个
int array[] = {121, 432, 564, 23, 1, 45, 788};
输出为“1 23 45 121 432 564 788”output
但是当我插入这个
int array[] = {3,4,1,5,2};
输出为“1 2 3 4 2496”
output
我实现了教程中的代码。谁能指出问题
#include <stdio.h>
void radix_sort(int array[], int size);
void counting_sort(int array[], int size, int place);
int main(void)
{
int array[] = {3,4,1,5,2};
int size = sizeof(array) / sizeof(int);
radix_sort(array, size);
for (int i = 0; i < size; i++)
printf("%i ", array[i]);
printf("\n");
}
void radix_sort(int array[], int size)
{
int max = array[0];
for (int i = 1; i < size; i++)
{
if (array[i] > max)
max = array[i];
}
for (int place = 1; max / place > 0; place *= 10)
counting_sort(array, size, place);
}
void counting_sort(int array[], int size, int place)
{
int output[size + 1];
int max = (array[0] / place) % 10;
for (int i = 1; i < size; i++)
{
if (((array[i] / place) % 10) > max)
max = array[i];
}
int count[max+1];
for (int i = 0; i < max; ++i)
count[i] = 0;
for (int i = 0; i < size; i++)
count[(array[i] / place) % 10]++;
for (int i = 1; i < 10; i++)
count[i] += count[i - 1];
for (int i = size-1; i >= 0; i--)
{
output[count[(array[i] / place) % 10] - 1] = array[i];
count[(array[i] / place) % 10]--;
}
for (int i = 0; i < size; i++)
array[i] = output[i];
}
for (int i = 1; i < 10; i++) {
将越界访问数组,因为 count[max+1]
=> count[5+1]
因此您的程序具有未定义的行为。它可能会崩溃或输出垃圾或做任何事情。
您应该在该循环中使用 i <= max
:
for (int i = 1; i <= max; i++) // use `i <= max` here
count[i] += count[i - 1];
您还需要将可变长度数组的内存清零count
,因为它在创建后将包含不确定的值。您尝试使用 for (int i = 0; i < max; ++i) count[i] = 0;
执行此操作,但错过了数组中的最后一个元素。你也需要 i <= max
:
int count[max + 1];
for (int i = 0; i <= max; ++i) count[i] = 0;
我正在学习 dsa,我试图在 c 中实现基数排序。我用这个 tutorial from programiz. 我实现了它,但是他们使用的数字数组得到了正确排序,但是当我使用不同的数组时,它显示了一些垃圾值。
当我插入这个
int array[] = {121, 432, 564, 23, 1, 45, 788};
输出为“1 23 45 121 432 564 788”output
但是当我插入这个
int array[] = {3,4,1,5,2};
输出为“1 2 3 4 2496”
output
我实现了教程中的代码。谁能指出问题
#include <stdio.h>
void radix_sort(int array[], int size);
void counting_sort(int array[], int size, int place);
int main(void)
{
int array[] = {3,4,1,5,2};
int size = sizeof(array) / sizeof(int);
radix_sort(array, size);
for (int i = 0; i < size; i++)
printf("%i ", array[i]);
printf("\n");
}
void radix_sort(int array[], int size)
{
int max = array[0];
for (int i = 1; i < size; i++)
{
if (array[i] > max)
max = array[i];
}
for (int place = 1; max / place > 0; place *= 10)
counting_sort(array, size, place);
}
void counting_sort(int array[], int size, int place)
{
int output[size + 1];
int max = (array[0] / place) % 10;
for (int i = 1; i < size; i++)
{
if (((array[i] / place) % 10) > max)
max = array[i];
}
int count[max+1];
for (int i = 0; i < max; ++i)
count[i] = 0;
for (int i = 0; i < size; i++)
count[(array[i] / place) % 10]++;
for (int i = 1; i < 10; i++)
count[i] += count[i - 1];
for (int i = size-1; i >= 0; i--)
{
output[count[(array[i] / place) % 10] - 1] = array[i];
count[(array[i] / place) % 10]--;
}
for (int i = 0; i < size; i++)
array[i] = output[i];
}
for (int i = 1; i < 10; i++) {
将越界访问数组,因为 count[max+1]
=> count[5+1]
因此您的程序具有未定义的行为。它可能会崩溃或输出垃圾或做任何事情。
您应该在该循环中使用 i <= max
:
for (int i = 1; i <= max; i++) // use `i <= max` here
count[i] += count[i - 1];
您还需要将可变长度数组的内存清零count
,因为它在创建后将包含不确定的值。您尝试使用 for (int i = 0; i < max; ++i) count[i] = 0;
执行此操作,但错过了数组中的最后一个元素。你也需要 i <= max
:
int count[max + 1];
for (int i = 0; i <= max; ++i) count[i] = 0;