C 使用计数排序对给定数组进行排序
代码如下:C 使用计数排序对给定数组进行排序,c,algorithm,sorting,C,Algorithm,Sorting,代码如下: #include<stdio.h> int main(){ int input[20],output[20],n,i,element,max; printf("Enter the no of elements"); scanf("%d ",&n); for(i = 1;i<=n;i++){ scanf("%d"
#include<stdio.h>
int main(){
int input[20],output[20],n,i,element,max;
printf("Enter the no of elements");
scanf("%d ",&n);
for(i = 1;i<=n;i++){
scanf("%d",&input[i]);
}
max = input[1];
for(i=1;i<=n;i++){
if(max<input[i]){
max = input[i];
}
}
int c[max + 1];
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
c[input[i]]++ ;
}
for(i = 1;i<=max;i++){
c[i] = c[i] + c[i-1];
}
for(i = 1;i<=max;i++){
output[c[input[i]]] = input[i];
c[input[i]]--;
}
for (i = 1; i < n; i++) {
input[i] = output[i];
}
for (i = 1; i <= n; ++i) {
printf("%d ", input[i]);
}
return 0;
}
#包括
int main(){
int输入[20],输出[20],n,i,元素,最大值;
printf(“输入元素编号”);
scanf(“%d”和“&n”);
对于(i=1;i首先,您的问题不一致。您提供了n=7
,但只传递了6个数字作为输入
其次,在实施过程中需要进行两项更改:
#include<stdio.h>
int main(){
int input[20],output[20],n,i,element,max;
printf("Enter the no of elements");
scanf("%d ",&n);
for(i = 1;i<=n;i++){
scanf("%d",&input[i]);
}
max = input[1];
for(i=1;i<=n;i++){
if(max<input[i]){
max = input[i];
}
}
int c[max + 1];
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
c[input[i]]++ ;
}
for(i = 1;i<=max;i++){
c[i] = c[i] + c[i-1];
}
for(i = 1;i<=n;i++){
output[c[input[i]]] = input[i];
c[input[i]]--;
}
for (i = 1; i <= n; i++) {
input[i] = output[i];
}
for (i = 1; i <= n; ++i) {
printf("%d ", input[i]);
}
return 0;
}
对于代码中的以下代码段:
for(i = 1;i<=max;i++){
output[c[input[i]]] = input[i];
c[input[i]]--;
}
输出:
7
3 2 5 16 3 2 8000
2 2 3 3 5 16 8000
<强> ps:< /强>该算法对负数无效。你可以考虑如何处理负数。
为什么在这个循环中跳过<代码>输入[0 ] < /代码>:(i=1;我也考虑你的输入,你输入没有项是7,然后作为输入3 2 5 16 3 2,那些是6个数。<代码> C [输入[i] ]
可能会导致未定义的行为。其中输入[i]
可能大于max+1
。除非您对输入范围有限制。C数组索引是基于零的。尝试从索引1开始会产生问题。
2 2 3 3 5 16 8000