gpt4 book ai didi

c++ - 计数排序 我的输入是1,4,3,1 但输出是垃圾值,1,1,3 输入不正确

转载 作者:行者123 更新时间:2023-11-30 21:20:55 25 4
gpt4 key购买 nike

#include<stdio.h>            
#include<stdlib.h>

main()
{
int A[200],p=0,r=0,s=0,i,n,temp=0,B[200];
printf("Enter no. of Element for counting sort :");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&A[i]);

printf("\nBefore Sorting: ");

for(i=0;i<n;i++)
printf("%d ",A[i]);

printf("\n");

for(i=0;i<n;i++)
{
if(A[i]>temp)
temp=A[i];
}

printf("\nLargest %d \n",temp);

counting_sort(A,B,n,temp);

for(i=0;i<n;i++)
printf("%d ",B[i]);

printf("\n");
}


counting_sort(int A[],int B[],int n,int temp)
{
int i=0,C[200],j;
for(i=0;i<=temp;i++)
C[i]=0;

for(i=0;i<n;i++)
C[A[i]]=C[A[i]]+1;

for(i=1;i<=temp;i++)
C[i]=C[i]+C[i-1];

for(i=n-1;i>=0;i--)
{
B[C[A[i]]]=A[i];
C[A[i]]=C[A[i]]-1;
}
}

最佳答案

好的,纸笔时间到了。您的输入是:

A = {1, 4, 3, 1}

您的计数确定正确:

C' = {0, 2, 0, 1, 1}

然后将其转换为累计计数:

C = {0, 2, 2, 3, 4}

这一步也是正确的。这个数组代表什么?对于A中的每个元素aC[a]是该元素在所有a之后的索引排序后的数组,B:

i      0   1   2   3    4
B[i] 1 1 3 4 <

对于不在 A 中的元素也是如此:C[2] 是 2。在索引后有一个由 0 个二进制组成的(虚构的) block 该 block 之后是 2。

因为索引是 block 之后的索引,所以在使用它之前必须递减索引:

for (i = n - 1; i >= 0; i--) {
C[A[i]] = C[A[i]] - 1;
B[C[A[i]]] = A[i];
}

否则,当您处理元素 4 时,您最终将写入索引 4,但该索引超出了数组的限制。 (您看到的数字只是来自 B 中未初始化元素的垃圾。)

顺便说一句,在C语言中,倒数时先减是很常见的事情,这是因为数组的上界是互斥的。你的循环可以这样写:

for (i = n; i-- > 0; ) {
C[A[i]] = C[A[i]] - 1;
B[C[A[i]]] = A[i];
}

缺少更新部分,因为递减发生在进入循环体之前。并且您无需在初始化中减去 1 即可逃脱。

关于c++ - 计数排序 我的输入是1,4,3,1 但输出是垃圾值,1,1,3 输入不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33021601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com