计数排序我的输入是1,4,3,1但是输出是垃圾值,1,1,3输入不正确
Counting Sort My input is 1,4,3,1 But output is garbage value,1,1,3 Input is not not correct
#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
中的每个元素a
,C[a]
是排序后数组中所有a
个元素的索引,B
:
i 0 1 2 3 4
B[i] 1 1 3 4 <
对于不在 A
中的元素也是如此:C[2]
是 2。在那个块之后的索引是 2 之后有一个(虚构的)零二进制块。 =24=]
因为索引是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];
}
缺少更新部分,因为递减发生在进入循环体之前。而且你在初始化时不减一就走了。
#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
中的每个元素a
,C[a]
是排序后数组中所有a
个元素的索引,B
:
i 0 1 2 3 4
B[i] 1 1 3 4 <
对于不在 A
中的元素也是如此:C[2]
是 2。在那个块之后的索引是 2 之后有一个(虚构的)零二进制块。 =24=]
因为索引是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];
}
缺少更新部分,因为递减发生在进入循环体之前。而且你在初始化时不减一就走了。