Velocity Reviews > Sorting a string aray in order of string length

# Sorting a string aray in order of string length

Tom St Denis
Guest
Posts: n/a

 07-09-2003
C.K. wrote:
> Given an array of strings (i.e char *strings[10]), write C code to sort the
> list in increasing order of string length. Run time efficiency is a primary
> concern.
>
> Thanks a lot!

Tom

C.K.
Guest
Posts: n/a

 07-09-2003
Given an array of strings (i.e char *strings[10]), write C code to sort the
list in increasing order of string length. Run time efficiency is a primary
concern.

Thanks a lot!

C.K.
Guest
Posts: n/a

 07-09-2003
No, I am now enjoying my summer vacation.

This is a question that I find from 'C Challenge' of a website. I am just
curious on how to solve it in an elegant way.

"Tom St Denis" <(E-Mail Removed)> ?????
news:_yUOa.103987\$(E-Mail Removed) ble.rogers.com...
> C.K. wrote:
> > Given an array of strings (i.e char *strings[10]), write C code to sort

the
> > list in increasing order of string length. Run time efficiency is a

primary
> > concern.
> >
> > Thanks a lot!

>
>
> Tom
>

pete
Guest
Posts: n/a

 07-09-2003
C.K. wrote:
>
> Given an array of strings (i.e char *strings[10]),
> write C code to sort the list in increasing order of string length.
> Run time efficiency is a primary concern.

#include <string.h>
#include <stdlib.h>

int compare(const void *arg1, const void *arg2)
{
size_t L1, L2;

L1 = strlen(arg1);
L2 = strlen(arg2);
return L2 > L1 ? -1 : L1 > L2;
}

qsort
(strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

Eric Sosman
Guest
Posts: n/a

 07-09-2003
"C.K." wrote:
>
> Given an array of strings (i.e char *strings[10]), write C code to sort the
> list in increasing order of string length. Run time efficiency is a primary
> concern.

Why is run time efficiency a primary concern when sorting
an array of just ten elements? With such a short array, how
do you even hope to measure the run time to find out what kind
of efficiency you've achieved?

--
http://www.velocityreviews.com/forums/(E-Mail Removed)

Chris Dollin
Guest
Posts: n/a

 07-09-2003
C.K. wrote:

> No, I am now enjoying my summer vacation.
>
> This is a question that I find from 'C Challenge' of a website. I am just
> curious on how to solve it in an elegant way.

The best way is to *try it yourself*, *then* ask for suggestions.

--
Chris "electric hedgehog" Dollin
C FAQs at: http://www.faqs.org/faqs/by-newsgrou...mp.lang.c.html
C welcome: http://www.angelfire.com/ms3/bchambl...me_to_clc.html

Default User
Guest
Posts: n/a

 07-09-2003

"C.K." wrote:
>
> No, I am now enjoying my summer vacation.
>
> This is a question that I find from 'C Challenge' of a website. I am just
> curious on how to solve it in an elegant way.

Don't top-post. Your replies belong following properly trimmed quotes.

The point of a C challenge is for YOU to work on it. Do your best and
post it here for critique. We don't do programming for random people to

Brian Rodenborn

Kevin Easton
Guest
Posts: n/a

 07-10-2003
pete <(E-Mail Removed)> wrote:
> C.K. wrote:
>>
>> Given an array of strings (i.e char *strings[10]),
>> write C code to sort the list in increasing order of string length.
>> Run time efficiency is a primary concern.

>
> #include <string.h>
> #include <stdlib.h>
>
> int compare(const void *arg1, const void *arg2)
> {
> size_t L1, L2;
>
> L1 = strlen(arg1);
> L2 = strlen(arg2);
> return L2 > L1 ? -1 : L1 > L2;
> }
>
> qsort
> (strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

You obviously didn't test this, because that won't work at all. The
const void * arguments qsort passes to the compare function are pointers
to the array elements - not the array elements themselves. In this
case, they're pointer-to-pointer-to-char, converted to void *. In this
case, the correct comparison function would be:

int lencomp(const void *a, const void *b)
{
char * const *sa = a;
char * const *sb = b;
size_t alen = strlen(*sa);
size_t blen = strlen(*sb);

return (alen > blen) - (alen < blen);
}

- Kevin.

pete
Guest
Posts: n/a

 07-10-2003
Kevin Easton wrote:
>
> pete <(E-Mail Removed)> wrote:
> > C.K. wrote:
> >>
> >> Given an array of strings (i.e char *strings[10]),
> >> write C code to sort the list in increasing order of string length.
> >> Run time efficiency is a primary concern.

> >
> > #include <string.h>
> > #include <stdlib.h>
> >
> > int compare(const void *arg1, const void *arg2)
> > {
> > size_t L1, L2;
> >
> > L1 = strlen(arg1);
> > L2 = strlen(arg2);
> > return L2 > L1 ? -1 : L1 > L2;
> > }
> >
> > qsort
> > (strings, sizeof strings/sizeof *strings, sizeof *strings, compare);

>
> You obviously didn't test this, because that won't work at all.
> The const void * arguments qsort passes to the compare function
> are pointers to the array elements
> - not the array elements themselves.
> In this case, they're pointer-to-pointer-to-char,
> converted to void *.
> In this case, the correct comparison function would be:
>
> int lencomp(const void *a, const void *b)
> {
> char * const *sa = a;
> char * const *sb = b;
> size_t alen = strlen(*sa);
> size_t blen = strlen(*sb);
>
> return (alen > blen) - (alen < blen);
> }

Thank you.
almost every single time that I post untested code.

My compiler likes it better this way:

char const **sa = a;
char const **sb = b;

--
pete

Kevin Easton
Guest
Posts: n/a

 07-10-2003
pete <(E-Mail Removed)> wrote:
> Kevin Easton wrote:

[...]
>> int lencomp(const void *a, const void *b)
>> {
>> char * const *sa = a;
>> char * const *sb = b;

[...]
> My compiler likes it better this way:
>
> char const **sa = a;
> char const **sb = b;

Then your compiler is broken . const void *a; and char * const *sa;
are equivalently-qualified pointers, but char const **sa; is not. The
first points to a const-qualified void, the second to a const-qualified
pointer to char, but the third points to a non-qualified pointer to a
pointer to const-qualified char.

- Kevin.