Done sort-lines exercise
This commit is contained in:
commit
8e70de5278
2 changed files with 101 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
sortlines/sortlines
|
||||
**/.ccls-cache
|
||||
**/.gdb_history
|
98
sortlines/sortlines.c
Normal file
98
sortlines/sortlines.c
Normal file
|
@ -0,0 +1,98 @@
|
|||
// vim: set ts=4 sw=4 et tw=80:
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#define MAX_LINE_SIZE 1001
|
||||
#define DEBUG
|
||||
|
||||
void swap(char** a, char** b);
|
||||
void print_words(char* words[], size_t start, size_t end);
|
||||
void quicksort_string(char* strings[static 1], size_t start, size_t end);
|
||||
|
||||
void swap(char** a, char** b) {
|
||||
char* tmp;
|
||||
tmp = *a;
|
||||
*a = *b;
|
||||
*b = tmp;
|
||||
}
|
||||
|
||||
void quicksort_string(char* strings[static 1], size_t start, size_t end) {
|
||||
|
||||
#ifdef DEBUG
|
||||
sleep(1);
|
||||
printf("%ld - %ld: ", start, end);
|
||||
print_words(strings, start, end);
|
||||
putchar('\n');
|
||||
#endif
|
||||
|
||||
if (end - start <= 2) {
|
||||
#ifdef DEBUG
|
||||
puts("returning");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
char* pivot = strings[end - 1];
|
||||
size_t i, gt = end - 1;
|
||||
for (i = start; i < gt; i++) {
|
||||
#ifdef DEBUG
|
||||
printf("i=%ld gt=%ld\n", i, gt);
|
||||
print_words(strings, start, end);
|
||||
putchar('\n');
|
||||
#endif
|
||||
if (strcmp(strings[i], pivot) > 0) {
|
||||
swap(&strings[--gt], &strings[i--]);
|
||||
}
|
||||
}
|
||||
swap(&strings[gt], &strings[end - 1]);
|
||||
|
||||
#ifdef DEBUG
|
||||
print_words(strings, start, gt);
|
||||
printf("| %s | ", strings[gt]);
|
||||
print_words(strings, gt + 1, end);
|
||||
putchar('\n');
|
||||
#endif
|
||||
|
||||
quicksort_string(strings, start, gt);
|
||||
quicksort_string(strings, gt + 1, end);
|
||||
}
|
||||
|
||||
void print_words(char* words[], size_t start, size_t end) {
|
||||
size_t i;
|
||||
for (i = start; i < end; i++) {
|
||||
printf("%s ", words[i] == NULL ? "NULL" : words[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
char line[MAX_LINE_SIZE];
|
||||
char* words[MAX_LINE_SIZE / 2];
|
||||
char* word = line;
|
||||
size_t chars = 0, words_len = 0;
|
||||
int c;
|
||||
bool last_alpha = false;
|
||||
while ((c = getchar()) != EOF) {
|
||||
if (!isalpha(c) || c == '\n') {
|
||||
if (last_alpha) {
|
||||
line[chars++] = '\0';
|
||||
words[words_len++] = word;
|
||||
word = line + chars;
|
||||
last_alpha = false;
|
||||
}
|
||||
if (c == '\n') {
|
||||
quicksort_string(words, 0, words_len);
|
||||
print_words(words, 0, words_len);
|
||||
putchar('\n');
|
||||
chars = 0;
|
||||
words_len = 0;
|
||||
word = line;
|
||||
}
|
||||
} else {
|
||||
line[chars++] = c;
|
||||
last_alpha = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in a new issue