HackerRank Sorting Array of Strings solution in c YASH PAL, 29 July 202429 July 2024 In this HackerRank Sorting array of strings in c programming problem solution To sort a given array of strings into lexicographically increasing order or into an order in which the string with the lowest length appears first, a sorting function with a flag indicating the type of comparison strategy can be written. The disadvantage with doing so is having to rewrite the function for every new comparison strategy. A better implementation would be to write a sorting function that accepts a pointer to the function that compares each pair of strings. Doing this will mean only passing a pointer to the sorting function with every new comparison strategy. Given an array of strings, you need to implement a string_sort function which sorts the strings according to a comparison function, i.e, you need to implement the function : void string_sort(const char **arr,const int cnt, int (*cmp_func)(const char* a, const char* b)){ } The arguments passed to this function are: an array of strings : arr length of string array: count pointer to the string comparison function: cmp_func You also need to implement the following four string comparison functions: int lexicographic_sort(char*, char*) to sort the strings in lexicographically non-decreasing order. int lexicographic_sort_reverse(char*, char*) to sort the strings in lexicographically non-increasing order. int sort_by_number_of_distinct_characters(char*, char*) to sort the strings in non-decreasing order of the number of distinct characters present in them. If two strings have the same number of distinct characters present in them, then the lexicographically smaller string should appear first. int sort_by_length(char*, char*) to sort the strings in non-decreasing order of their lengths. If two strings have the same length, then the lexicographically smaller string should appear first. Sorting array of strings solution HackerRank Sorting array of strings solution in c #include <stdio.h> #include <stdlib.h> #include <string.h> int lexicographic_sort(const char* a, const char* b) { return strcmp(a, b); } int lexicographic_sort_reverse(const char* a, const char* b) { return strcmp(b, a); } #define CHARS 26 int distinct_chars(const char *a) { int dist = 0; int chars[CHARS] = {0}; while (*a != '\0') { int chr = (*a++) - 'a'; if (chr < CHARS) chars[chr]++; } for (int i = 0; i < CHARS; i++) if (chars[i]) dist++; return dist; } int sort_by_number_of_distinct_characters(const char* a, const char* b) { int res = distinct_chars(a) - distinct_chars(b); return (res) ? res : lexicographic_sort(a, b); } int sort_by_length(const char* a, const char* b) { int res = strlen(a) - strlen(b); return (res) ? res : lexicographic_sort(a, b); } /* simple bubble sort :) */ void string_sort(char** arr, const int len,int (*cmp_func)(const char* a, const char* b)) { int sorted = 0; int top = len - 1; while (!sorted) { sorted = 1; for (int i = 0; i < top; i++) { if (cmp_func(arr[i], arr[i + 1]) > 0) { char *tmp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = tmp; sorted = 0; } } top--; } } int main() { int n; scanf("%d", &n); char** arr; arr = (char**)malloc(n * sizeof(char*)); for(int i = 0; i < n; i++){ *(arr + i) = malloc(1024 * sizeof(char)); scanf("%s", *(arr + i)); *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1); } string_sort(arr, n, lexicographic_sort); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, lexicographic_sort_reverse); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_length); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_number_of_distinct_characters); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); } Second solution #include <stdio.h> #include <stdlib.h> #include <string.h> int lexicographic_sort(const char* a, const char* b){ return strcmp(a, b) > 0; } int lexicographic_sort_reverse(const char* a, const char* b){ return strcmp(a, b) <= 0; } int sort_by_number_of_distinct_characters(const char* a, const char* b){ int c1 = 0, c2 = 0; int hsh1[26] = {0}, hsh2[26] = {0}; int n1 = strlen(a); int n2 = strlen(b); for(int i = 0; i < n1; i++){ hsh1[a[i] - 'a'] = 1; } for(int i = 0; i < n2; i++){ hsh2[b[i] - 'a'] = 1; } for(int i = 0; i < 26; i++){ if(hsh1[i]) c1++; if(hsh2[i]) c2++; } if( c1 != c2) return c1 > c2; else return strcmp(a, b) > 0; } int sort_by_length(const char* a, const char* b){ if(strlen(a) != strlen(b)) return strlen(a) > strlen(b); else return strcmp(a, b) > 0; } void string_sort(char** arr,const int len,int (*cmp_func)(const char* a, const char* b)){ for(int i = 1; i < len; i++){ int j = i; char* p = arr[i]; while(j > 0){ if((*cmp_func)(arr[j-1],p) > 0 ) arr[j] = arr[j-1]; else break; j--; } arr[j] = p; } } int main() { int n; scanf("%d", &n); char** arr; arr = (char**)malloc(n * sizeof(char*)); for(int i = 0; i < n; i++){ *(arr + i) = malloc(1024 * sizeof(char)); scanf("%s", *(arr + i)); *(arr + i) = realloc(*(arr + i), strlen(*(arr + i)) + 1); } string_sort(arr, n, lexicographic_sort); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, lexicographic_sort_reverse); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_length); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); string_sort(arr, n, sort_by_number_of_distinct_characters); for(int i = 0; i < n; i++) printf("%s\n", arr[i]); printf("\n"); } c coding problems hackerrank solutions cHackerRank