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.
1 Answer 1
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]
.
-
\$\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 itnlog(n)
if you write a merge sort, ornlog(n)
in average case if you write quick sort. \$\endgroup\$sps– sps2016年08月05日 15:36:27 +00:00Commented Aug 5, 2016 at 15:36