1
\$\begingroup\$

Is there a simpler way with a simpler notation to do the following part of code:

void swap(char **s1, char **s2){ char *tmp=*s1; *s1=*s2; *s2=tmp; } void sort(char ***m, int dim){ int i, j, flag=1; for(i=0; i<dim-1 && flag==1; i++){ flag=0; for(j=0; j<dim-1; j++) if(strcmp((*m)[j],(*m)[j+1])>0){ swap(&(*m)[j],&(*m)[j+1]); flag=1; } } } int main(int argc, char *argv[]){ char **m, s[30]; int i; m=malloc(N*sizeof(char *)); for(i=0; i<N; i++){ scanf("%s", s); m[i]=strdup(s); } sort(&m, N); for(i=0; i<N; i++) printf("%s\n", m[i]); for(i=0; i<N; i++) free(m[i]); free(m); return 0; } 

The aim is to sort an array of strings allocated dynamically. What I've written above works but I want to know if there is a more efficient and readable way to write the function sort.

\$\endgroup\$
0

    1 Answer 1

    1
    \$\begingroup\$

    Assuming the logic of your sort code is correct.


    You can just have your sort function as:

    void sort(char **m, int dim); 

    Your sort function can be like:

    void sort(char **m, int dim) { int i, j, flag=1; for(i=0; i<dim-1 && flag==1; i++){ flag=0; for(j=0; j<dim-1; j++) if(strcmp(m[j],m[j+1])>0){ swap(&m[j],&m[j+1]); flag=1; } } } 

    This improves some readability. There is no need to pass &m - like (sort(&m, N)) - to your sort. Just passing m - like sort(m, N) - is enough for changing/comparing/swapping m[i] and m[j].

    \$\endgroup\$
    1
    • \$\begingroup\$@Iu Tub Your code still can be improved performance wise. As you have written, it has O(n^2) worst case time complexity. You can make it nlog(n) if you write a merge sort, or nlog(n) in average case if you write quick sort.\$\endgroup\$
      – sps
      CommentedAug 5, 2016 at 15:36