Sorting Array of Strings

  • + 0 comments

    Here is my take on this.

    int lexicographic_sort(const char* a, const char* b) {
        while (*(a) && *(b)) 
        {
            if(*a > *b) return 1;
            if(*a < *b) return -1;
            a++;
            b++;
        };
        if (*a) return 1;
        if (*b) return -1;
        
        return 0;
    }
    
    int lexicographic_sort_reverse(const char* a, const char* b) {
        while (*(a) && *(b)) 
        {
            if(*a > *b) return -1;
            if(*a < *b) return 1;
            a++;
            b++;
        };
        if (*a) return -1;
        if (*b) return 1;
        
        return 0;
    }
    
    int sort_by_number_of_distinct_characters(const char* a, const char* b) {
        int lena = strlen(a), lenb = strlen(b);
        char *arra = NULL, *arrb = NULL;
        char *arra_ad = NULL, *arrb_ad = NULL;
        int arra_sz = 0, arrb_sz = 0;
        const char *a_ad = a, *b_ad = b;
    
    
        arra = (char *)calloc(lena+1, sizeof(char));
        arrb = (char *)calloc(lenb+1, sizeof(char));
        arra_ad = arra;
        arrb_ad = arrb;
    
        while(*a || *b)
        {
            if (*a)
            {
                arra = arra_ad;
    
                while (*arra)
                {
                    if(*a == *arra) goto founda;
                    arra++;
                }
                arra_ad[arra_sz] = *a;
                arra_sz++;
    
                founda:;
                a++;
            }
            if (*b)
            {
                arrb = arrb_ad;
    
                while (*arrb)
                {
                    if(*b == *arrb) goto foundb;
                    arrb++;
                }
                arrb_ad[arrb_sz] = *b;
                arrb_sz++;
    
                foundb:;
                b++;
            }
        }
    
        free(arra_ad);
        free(arrb_ad);
    
        if(arra_sz > arrb_sz) return 1;
        if(arra_sz < arrb_sz) return -1;
    
        return lexicographic_sort(a_ad, b_ad);
    }
    
    int sort_by_length(const char* a, const char* b) {
        int lena = strlen(a), lenb = strlen(b);
        if (lena > lenb) return 1;
        if (lena < lenb) return -1;
    
        return lexicographic_sort(a, b);
    }
    
    void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b)){
        char* temp = NULL;
        int i = 0, j = 0;
    
        for(i = len - 1; i > 0; i--)
        {
            for(j = 0; j < i; j++)
            {
                if (cmp_func(arr[j], arr[j+1])>0)
                {
                    temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }