2015-01-20 37 views
0
#include<stdio.h> 


void countingSort(int array[], int k, int n){ 
    int i,j; 
    int B[100],C[1000]; 
    for (i=0;i<=k;i++) 
    { 
     C[i]=0; 
    } 
    for (j=0;j<n;j++) 
    { 
     C[array[j]]++; 
    } 
    for (i=1;i<=k;i++) 
    { 
     C[i]+=C[i-1]; 
    } 
    for (j=0;j<n;j++) 
    { 
     B[--C[array[j]]]=array[j]; 
    } 
    printf("Sortiran niz je: \n"); 
    for(i=0;i<n;i++) 
    { 
     printf("%d ", B[i]); 
    } 
    printf("\n"); 
} 

void max(int array[], int *k,int n){ 
    int i; 
    printf("Broj elemenata u nizu je %d\n",n); 
    for(i=0;i<n;i++) 
    { 
     if(array[i]>*k) { 
      *k=array[i]; 
     } 
    } 
} 

int main(int brArg, char *arg[]){ 
    FILE *ulaz; 
    ulaz=fopen(arg[1],"r"); 

    int array[1000]; 
    int i=0,j,k=0,n,x,m; 

    while(fscanf(ulaz,"%d", &array[i])!=EOF)  
     i++; 
    fclose(ulaz); 
    n=i;  
    max(array,&k,n); 
    countingSort(array,k,n); 
    return 0; 
} 

我的代码非常适合正整数,但我需要修改它,以便它也可以对负整数进行排序。我希望你能帮助我。我没有别的话要说,但除非我在这里写点东西,否则我不能发表问题,所以我希望这已经足够了。我必须对我的代码进行哪些更改才能对负数进行排序?

+0

格式化您的代码,它是不可读的。 – 2015-01-20 19:30:20

+1

而且从不*写出像B [ - C [array [j]]] = array [j];'的东西。这太难以遵循。 – Kevin 2015-01-20 19:30:54

+3

您的计数排序适用于某个范围的整数,此时[0,1000]。您不强制执行该范围,并且数组中的数字2000与负数数字一样差。无论如何:你可以找到最低的数字'base'和索引'C [arr [i] - base]'。 – 2015-01-20 19:34:48

回答

0

使用链表,Glist存在于GObject库中。如果你只需要处理32位整数,你可以用很少的额外编程来使用它。当你从文件perfom中读取整数时,在while循环中插入排序。

相关问题