--- title: 研修であつかったアルゴリズムを黙々と書くよ author: kazu634 date: 2008-05-10 url: /2008/05/10/_986/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3999;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - C - Programming ---
随時追加していく。
#include <stdio.h> int main(void); int bin_search(const int a[], int num_a, int key); int bin_search(const int a[], int num_a, int key) { int pof = 1; /* 二分探索の始点(Position of First) */ int pol = num_a - 1; /* 二分探索の終点(Position of Last) */ int poc = (pof + pol) / 2; /* 二分探索の中央(Position of Center)*/ int p = -1; /* keyが発見された要素の添え字 */ while (p == -1 && pof <= pol) { /* 中央の値がkeyと一致した! */ if (a[poc] == key) { p = poc; return(p); } else if (a[poc] < key) { /* 中央の値よりもkeyの値の方が大きい */ pof = poc + 1; poc = (pof + pol) / 2; } else if (key < a[poc]) { /* keyの値よりも中央の値の方が大きい*/ pol = poc - 1; poc = (pof + pol) / 2; } } return(p); } int main(void) { int array[8] = {, 10, 20, 30, 40, 50, 60, 70}; int num_array = sizeof(array) / sizeof(array[]); printf ("%d\n", bin_search(array, num_array, 100)); return(); }
基本選択法は整列対象のデータの中から一番大きいデータを選び出して、整列対象の最後のデータと交換する。そして整列対象の最後のデータをのぞいて、もう一度同じ処理を行う。この走査を整列対象のデータ数が残り一個になるまで繰り返して行うことによって、値が大きなデータを次第に右端の方に移していく方法である。
#include <stdio.h> int main(void); /* sortだとすでに使われてそうだから適当に名前付け */ void m_sort(int a[], const int num_a); void prt_int_array(const int a[], int num_a); void prt_int_array(const int a[], int num_a) { int i; for (i = ;i < num_a;i++) { printf ("%d, ", a[i]); } printf ("\n"); } void m_sort(int a[], const int num_a) { int curwork = num_a - 1; /* 確定させたい配列の添え字 */ int max_a_num; /* 未確定の要素の中で最大値の要素の添え字 */ int i, tmp; /* 確定させたい配列の要素数が 2 になるまで */ while ( < curwork) { prt_int_array(a, num_a); /* とりあえず確定させたい配列の添え字を最大値と仮定 */ max_a_num = curwork; printf ("確定させたい要素の添え字: %d\n", curwork); printf ("0... %d までの範囲を探索するよ。\n", curwork - 1); /* i を「確定させたい要素の添え字 - 1」までまわす */ for (i = ;i < curwork;i++) { /* それまでの最大値よりもa[i]が大きければ */ if (a[max_a_num] < a[i]) { printf ("a[%d] < a[%i]\n", max_a_num, i); /* 最大値の要素の添え字を max_a_num に代入 */ max_a_num = i; } } printf ("Change %d(a[%d]) --> %d(a[%d])\n\n", a[max_a_num], max_a_num, a[curwork], curwork); /* 最大値を a[curwork] に代入 */ tmp = a[curwork]; a[curwork] = a[max_a_num]; a[max_a_num] = tmp; curwork--; } } int main(void) { int array[8] = {100, 95, 900, 85, 9980, 795, 70, 695}; int num_array = sizeof(array) / sizeof(array[]); m_sort(array, num_array); prt_int_array(array, num_array); return(); }
#include <stdio.h> int main(void); void bubble_sort(int a[], const int num_a); void prt_int_array(const int a[], int num_a); void prt_int_array(const int a[], int num_a) { int i; for (i = ;i < num_a;i++) { printf ("%d, ", a[i]); } printf ("\n"); } void bubble_sort(int a[], const int num_a) { int curwork = num_a - 1; /* 確定させたい配列の添え字 */ int i, tmp; /* 確定させたい配列の要素数が 2 になるまで */ while ( < curwork) { prt_int_array(a, num_a); /* curwork - 1までずっとiの値を変化させる */ for (i = ;i < curwork;i++) { /* a[i] よりも a[i+1] が小さければ交換 */ if (a[i+1] < a[i]) { tmp = a[i]; a[i] = a[i+1]; a[i+1] = tmp; } } curwork--; } } int main(void) { int array[8] = {100, 95, 900, 85, 9980, 795, 70, 695}; int num_array = sizeof(array) / sizeof(array[]); bubble_sort(array, num_array); prt_int_array(array, num_array); return(); }
#include <stdio.h> int main(void); void m__sort(int a[], const int num_a); void prt_int_array(const int a[], int num_a); void prt_int_array(const int a[], int num_a) { int i; for (i = ;i < num_a;i++) { printf ("%d, ", a[i]); } printf ("\n"); } void m_sort(int a[], const int num_a) { int arranged = ; /* 整列済みの最終要素の添え字 */ int curwork = 1; /* 追加データ要素の添え字 */ int i, tmp; /* 最後まで整列するまで */ while (arranged < num_a - 1) { printf ("%d まで整列済み。 a[%d] を追加データと考えるよ。\n", arranged, curwork); printf ("%d ... %d までを %d と比較するよ!\n", , arranged, a[curwork]); prt_int_array(a, num_a); printf ("\n"); /* 追加データまで走査する */ for (i = curwork; < i;i--) { /* もし右側の要素が左側よりも小さければ交換する */ if (a[i] < a[i-1]) { tmp = a[i-1]; a[i-1] = a[i]; a[i] = tmp; } } /* 整列済みの添え字と追加データの添え字をインクリメント */ arranged++; curwork++; } } int main(void) { int array[8] = {100, 95, 900, 85, 9980, 795, 70, 695}; int num_array = sizeof(array) / sizeof(array[]); m_sort(array, num_array); prt_int_array(array, num_array); return(); }