問題
- クイックソートを作成せよ。配列Aをソートせよ。(教科書 p. 60の例。問3.5 p.64) 再帰的なプログラムを使うこと。
- STEP2.1 をうまく活用すること。
#define N 10 int a[N]={42,33,78,19,46,63,25,11,54,17}; とする。
BEFORE : 42 33 78 19 46 63 25 11 54 17 AFTER : 11 17 19 25 33 42 46 54 63 78
解答例
[未完プログラム]
partition関数は STEP.2.1を /* swap関数は、分割コンパイルするバージョン */ /* gcc -c 0202.c gcc -o 0202 0202.obj swap.obj */ #include "swap.h" #define N 10 /* 大域変数 */ int a[N]={42,33,78,19,46,63,25,11,54,17}; void print_array(int left, int right); int partition(int left, int right); void quick_sort(int left, int right); void print_array(int from, int to) { /* from番目から to番目までの要素をプリント */ int i; for (i = from ; i <= to; i ++) printf("%3d ", a[i]); printf("\n\n"); } int main(void){ /* 配列a ソート前。表示 */ printf ("BEFORE :"); print_array(0, N-1); quick_sort(0, N-1); /* クイックソート! */ /* 配列a ソート後。表示 */ printf (" AFTER :"); print_array(0, N-1); return(0); } void quick_sort(int left, int right) { /* 疑似コードを参考に自作しよう。コードは簡単。納得までねばろう */ } /* 以下はSTEP2.1 この関数がクイックソートの根幹部です。 */ int partition(int left, int right){ int i, j, pivot; pivot = a[left]; /* pivotは、最左 */ i = left+1; /* 左から右へ動くポインター */ j = right; /* 右から左へ動くポインター */ /* 疑似コードを参考に作成しなさい */ }
コメント