C Program to sort an array of Strings lexicographically , reverse lexicographically , by number of distinct characters and by length - HackerRank
// Program by Akash Tripathi (@proakash256)
#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(a, b);
}
int sort_by_number_of_distinct_characters(const char *a, const char *b)
{
int c = 1 , d = 1 , flag = 0;
for(int i = 1; i < strlen(a); i = i + 1)
{
int j;
for(j = 0; j < i; j = j + 1)
{
if(a[j] == a[i])
{
break;
}
}
if(i == j)
c = c + 1;
}
for(int i = 1; i < strlen(b); i = i + 1)
{
int j;
for(j = 0; j < i; j = j + 1)
{
if(b[j] == b[i])
{
break;
}
}
if(i == j)
d = d + 1;
}
if(c > d)
{
flag = 1;
}
else if(c < d)
{
flag = -1;
}
else if(c == d)
{
flag = strcmp(a, b);
}
return flag;
}
int sort_by_length(const char *a, const char *b)
{
int c = strlen(a), d = strlen(b) , flag = 0;
if(c > d)
{
flag = 1;
}
else if(c < d)
{
flag = -1;
}
else if(c == d)
{
flag = strcmp(a, b);
}
return flag;
}
void string_sort(char **arr, const int len, int (*cmp_func)(const char *a, const char *b))
{
static int flag = 1;
if (flag == 1)
{
for (int j = 0; j < (len - 1); j = j + 1)
{
for (int i = 0; i < (len - 1 - j); i = i + 1)
{
int c = cmp_func(*(arr + i), *(arr + i + 1));
if (c > 0)
{
char *temp;
temp = malloc(1024 * sizeof(char));
strcpy(temp, arr[i]);
temp = realloc(temp, strlen(temp) + 1);
strcpy(arr[i], arr[i + 1]);
strcpy(arr[i + 1], temp);
free(temp);
}
}
}
flag = flag + 1;
}
else if (flag == 2)
{
for (int j = 0; j < (len - 1); j = j + 1)
{
for (int i = 0; i < (len - 1 - j); i = i + 1)
{
int c = cmp_func(*(arr + i), *(arr + i + 1));
if (c < 0)
{
char *temp;
temp = malloc(1024 * sizeof(char));
strcpy(temp, arr[i]);
temp = realloc(temp, strlen(temp) + 1);
strcpy(arr[i], arr[i + 1]);
strcpy(arr[i + 1], temp);
free(temp);
}
}
}
flag = flag + 1;
}
else if (flag == 3)
{
for (int j = 0; j < (len - 1); j = j + 1)
{
for (int i = 0; i < (len - 1 - j); i = i + 1)
{
int c = cmp_func(*(arr + i), *(arr + i + 1));
if (c > 0)
{
char *temp;
temp = malloc(1024 * sizeof(char));
strcpy(temp, arr[i]);
temp = realloc(temp, strlen(temp) + 1);
strcpy(arr[i], arr[i + 1]);
strcpy(arr[i + 1], temp);
free(temp);
}
}
}
flag = flag + 1;
}
else if (flag == 4)
{
for (int j = 0; j < (len - 1); j = j + 1)
{
for (int i = 0; i < (len - 1 - j); i = i + 1)
{
int c = cmp_func(*(arr + i), *(arr + i + 1));
if (c > 0)
{
char *temp;
temp = malloc(1024 * sizeof(char));
strcpy(temp, arr[i]);
temp = realloc(temp, strlen(temp) + 1);
strcpy(arr[i], arr[i + 1]);
strcpy(arr[i + 1], temp);
free(temp);
}
}
}
}
return;
}
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);
}
printf("\n");
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");
}
Comments
Post a Comment