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