トップページ > プログラム > 2015年09月12日 > 96TVgXwJ

書き込み順位&時間帯一覧

5 位/167 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000005000000000000005



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net

書き込みレス一覧

なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
316 :デフォルトの名無しさん[sage]:2015/09/12(土) 09:27:37.42 ID:96TVgXwJ
#include <stdio.h>
#define NUM_DATA 8
void ShellSort(int num[ ], int n) ;
void InsSort(int num[ ], int gap, int n);
void ShowData(int num[ ], int n);
void main(void);

/* n 個のデータのシェルソートを行う */
void ShellSort(int num[ ], int n)
{
int gap;
for (gap = n / 2; gap > 0; gap /= 2)
InsSort(num, gap, n);
}
/* n 個のデータの単純挿入ソートを行う */
void InsSort(int num[ ], int gap, int n)
{
int i, j, temp;
for (i = gap; i < n; i ++) {
for (j = i - gap; j >= 0; j -= gap) { /* このループで */
if (num[j] <= num[j + gap]) /* j 番目とj + gap 番目と比較 */
break; /* ここにbreak;を挿入。H.O.さんご指摘ありがとうございました。 */
else {
temp = num[j]; /* 要素の入れ替え */
num[j] = num[j + gap];
num[j + gap] = temp;
ShowData(num, NUM_DATA); /* 途中経過を表示 */
}
}
}
printf("\n"); /* InsSort( ) を抜ける時改行 */
}
なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
318 :デフォルトの名無しさん[sage]:2015/09/12(土) 09:30:14.33 ID:96TVgXwJ
#include <stdio.h>
void RadixSort(int x[ ], int n, int r);
void ShowData(int x[ ], int n);
void main(void);
#define NUM_DATA 10
static int rad[NUM_DATA]; /* 基数をしまう配列 */
static int y[NUM_DATA]; /* 作業用配列 */
/* 基数ソートを行う */
void RadixSort(int x[ ], int n, int r) /* x[ ]:ソートするデータ */
{ /* n:データの数 */
int i, j, k; /* r:基数を取り出す最大値 */
int m = 1; /* 基数を取り出す桁 */
while (m <= r) {
for (i = 0; i < n; i++)
rad[i] = (x[i] / m) % 10; /* 基数を取り出し rad[i] に保存 */

k = 0; /* 配列の添字として使う */
for (i = 0; i <= 9; i++) /* 基数は 0 から 9 */
for (j = 0; j < n; j++)
if (rad[j] == i) /* 基数の小さいものから */
y[k++] = x[j]; /* y[ ] にコピー */

for (i = 0; i < n; i++)
x[i] = y[i]; /* x[ ] にコピーし直す */

/* 途中経過を表示 */
printf("\nソート中:\n");
ShowData(x, n);

m *= 10; /* 基数を取り出す桁を一つ上げる */
}
}
なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
319 :デフォルトの名無しさん[sage]:2015/09/12(土) 09:30:27.18 ID:96TVgXwJ
/* n 個のデータを表示する */
void ShowData(int x[ ], int n)
{
int i;

for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}

void main(void)
{ /* ソートするデータ */
int x[NUM_DATA] = { 5489, 1473, 7853, 1058, 9448,
1118, 7979, 2163, 1856, 3117
};
int n = 10; /* ソートするデータ数 */
int r = 1000; /* ソートするデータから取り出す基数の上限 */

/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, n);
printf("\n");

RadixSort(x, n, r);

/* ソート後のデータを表示 */
printf("\n\nソート後:\n");
ShowData(x, n);
}
なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
320 :デフォルトの名無しさん[sage]:2015/09/12(土) 09:30:56.98 ID:96TVgXwJ
#include <stdio.h>
#define MAX_DATA 10
int temp[MAX_DATA]; /* 最小でも配列と同じサイズの領域が必要 */
void MergeSort(int x[ ], int left, int right);
void main(void);
/* 配列 x[ ] の left から right の要素のマージソートを行う */
void MergeSort(int x[ ], int left, int right)
{
int mid, i, j, k;
if (left >= right) /* 配列の要素がひとつなら */
return; /* 何もしないで戻る */
/* ここでは分割しているだけ */
mid = (left + right) / 2; /* 中央の値より */
MergeSort(x, left, mid); /* 左を再帰呼び出し */
MergeSort(x, mid + 1, right); /* 右を再帰呼び出し */
/* x[left] から x[mid] を作業領域にコピー */
for (i = left; i <= mid; i++)
temp[i] = x[i];
/* x[mid + 1] から x[right] は逆順にコピー */
for (i = mid + 1, j = right; i <= right; i++, j--)
temp[i] = x[j];

i = left; /* i とj は作業領域のデーターを */
j = right; /* k は配列の要素を指している */

for (k = left; k <= right; k++) /* 小さい方から配列に戻す */
if (temp[i] <= temp[j]) /* ここでソートされる */
x[k] = temp[i++];
else
x[k] = temp[j--];
}
なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
321 :デフォルトの名無しさん[sage]:2015/09/12(土) 09:31:13.83 ID:96TVgXwJ
void main(void)
{
int i;
/* ソートされるデータ */
int x[ ] = {9, 4, 6, 2, 1, 8, 0, 3, 7, 5};

/* ソート前のデータを表示 */
printf("ソート前\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);

MergeSort(x, 0, MAX_DATA - 1);

/* ソート後のデータを表示 */
printf("ソート後\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);
}


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。