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.

asked Aug 5, 2016 at 11:43
\$\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].

answered Aug 5, 2016 at 11:54
\$\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\$ Commented Aug 5, 2016 at 15:36

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.