プログラミング言語 C
クイックソートプログラムを 次の本を参考に 実際に動かしてみた。
「基礎C言語」(isbn:4000078569) p192-197
初めに q_sort.c ファイルに ちょっと コードを追加、
- /* quick_sort.c */
- #include
- void q_sort();
- void swap();
- void quick_sort(int a[], int n)
- {
- q_sort(a, 0, n); /* left の値に 前もって 0 を入れておく */
- }
- void q_sort(int v[], int left, int right)
- {
- int i;
- int last;
- if (left >= right)
- return;
- swap(v, left, (left + right)/2);
- last = left;
- for (i = left + 1; i <= right; i++)
- if (v[i] < v[left])
- swap(v, ++last, i);
- swap (v, left, last);
- q_sort(v, left, last - 1);
- q_sort(v, last + 1, right);
- }
- void swap(int v[], int i, int j)
- {
- int tmp;
- tmp = v[i];
- v[i] = v[j];
- v[j] = tmp;
- }
次は 読み込み用の read_array.c ファイル、
- /* read_array.c */
- #include
- int read_array(int a[], int limit)
- {
- int n = 0;
- printf("Input whole numbers upto %d.\n", limit);
- printf("standard input:[enter][ctrl+d]\n");
- /*上の 2行は説明文のため、コメントアウトしても OK */
- while (n < limit && scanf("%d", &a[n]) != EOF)
- ++n;
- return --n; /* 初期値分を 1つ減らしておく */
- }
ソートの結果を出力する print_array.c ファイル、
- /* print_array.c */
- #include
- void print_array(int a[], int n)
- {
- int i;
- for (i = 0; i <= n; i++) {
- printf("%3d ", a[i]);
- if ((i + 1) % 10 == 0) { /* データは 1行に 10個ずつ出力 */
- putchar('\n');
- }
- }
- if (i % 10 != 0) /* この i は 全データ数 */
- putchar('\n');
- }
関数 main() ファイル、これは 簡単に、
- /* q_main.c */
- #include
- #include "q_header.h"
- /* クイックソートプログラム */
- main()
- {
- int a[MAX];
- int n; /* 全データ数 */
- n = read_array(a, MAX);
- quick_sort(a, n);
- print_array(a, n);
- return 0;
- }
最後に ヘッダファイルを作成、
- /* q_header.h */
- #define MAX 100
- int read_array();
- int print_array();
- void quick_sort();
コンパイルしてみます。まず オブジェクトファイルの作成。
cc -c q_main.c quick_sort.c read_array.c print_array.c
コンパイルエラーがあれば ここで訂正して、実行ファイルを作成。
cc -o q_sort q_main.o quick_sort.o read_array.o print_array.o
元になる 数字のリストですが、その前に、以前つくった random.c ファイルを 少し いじっておく。
- /* random.c */
- #include
- #include
- /* ランダムな数値のファイルを用意する */
- #define MAX 88
- struct List {
- int data;
- struct List *next;
- };
- main()
- {
- FILE *fp;
- int i;
- int seed;
- char buf[64];
- struct List *prev, *curr;
- prev = NULL;
- printf("Input seed = ");
- for ( ; scanf("%d", &seed) != 1 ; ) {
- printf("It's not finger. Input seed = ");
- scanf("%s", buf);
- }
- srand(seed);
- printf("OK, make 'random.txt' now.\n");
- fp = fopen("random.txt", "w");
- if (fp != NULL) {
- for (i = 0; i < MAX; i++) {
- curr = (struct List *)malloc(sizeof(struct List));
- fprintf(fp, "%d ", curr->data = rand() % 1000);
- curr->next = NULL;
- if (prev != NULL) {
- prev->next = curr;
- }
- prev = curr;
- }
- fprintf(fp, "\n");
- fclose(fp);
- }
- return 0;
- }
コンパイル後、$./random として 適当な数値を入力すると random.txt が 作成される。
$./q_sort < random.txt > sort.txt; cat sort.txt として 確認。