--- title: 研修であつかったアルゴリズムを黙々と書くよ author: kazu634 date: 2008-05-10 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();
}