C言語 ソートについて
#include <stdio.h>
#include <stdbool.h>
#define NUM_ARRAY 4
#define NUM_DATA 5
int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数
void selection_sort(int a[], int n) {
}
int main(void) {
int data[NUM_ARRAY][NUM_DATA] =
{{9, 7, 5, 6, 8},
{9, 8, 7, 6, 5},
{5, 6, 7, 8, 9},
{5, 6, 8, 7, 9}};
for (int i = 0; i < NUM_ARRAY; i++) {
count_swap = 0;
count_comparison = 0;
int d[NUM_DATA];
copy_array(data[i], d, NUM_DATA); // 配列のコピー
printf("----------------\n");
print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示
printf("比較回数: %d\n", count_comparison); // 比較回数の表示
printf("交換回数: %d\n", count_swap); // 交換回数の表示
}
}
上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。
下に自分が今書いているものを置いておきます。
#include <stdbool.h>
#include <stdio.h>
#define NUM_ARRAY 4
#define NUM_DATA 5
int count_swap = 0;
int count_comparison = 0;
void swap(int d[], int i, int j) {
count_swap += 1;
printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]);
int temp = d[i];
d[i] = d[j];
d[j] = temp;
}
void copy_array(int *a, int *b, int n) {
for (int i = 0; i < n; i++) {
b[i] = a[i];
}
}
void print_array(int d[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", d[i]);
}
printf("\n");
}
bool compare(int d[], int i, int j) {
count_comparison += 1;
printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]);
if (d[i] > d[j]) {
return true;
} else {
return false;
}
}
void selection_sort(int d[], int n) {
int min;
for (int i = 0; i < n - 1; i++) {
min = i;
for (int j = i + 1; j < i; j++) {
if (compare(d, min, j)) {
min = j;
}
}
swap(d, i, min);
print_array(d, n);
}
}
int main(void) {
int data[NUM_ARRAY][NUM_DATA] = {
{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}};
for (int i = 0; i < NUM_ARRAY; i++) {
count_swap = 0;
count_comparison = 0;
int d[NUM_DATA];
copy_array(data[i], d, NUM_DATA); // 配列のコピー
printf("----------------\n");
print_array(d, NUM_DATA); // ソート前の配列の表⽰
selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏
print_array(d, NUM_DATA); // ソート後の配列の表⽰
printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰
printf("交換回数: %d\n", count_swap); // 交換回数の表⽰
}
}
お礼
for文の落とし穴にはまっていたようです。 ありがとうございました。