各種ソート練習
バブルソートをC言語で書くとどうなるのか。練習で書いてみる。
自分で書いたやつ
バブルソート
int j=0,work=0; i = 30; for(i=30;i>=2;i--); { for(j=0;j<=i-1;j++); { if(sai[j] > sai[j+1]) { work=sai[j]; sai[j]=sai[j+1]; sai[j+1]=work; } } }
自分が書いたやつのままだとソートが途中までしか行われない。なんでだろう?
for (data = n; data > 1; --data)
みたいな形で、データを一度実数じゃなくて変数に代入しないとうまくいかないのか。
選択ソート(最大値選択)
自分が書いたやつ。正解は大なりイコールにしなきゃいけない。でないと酷くいいかげんなソートになる。
int selection_sort(int sai[], int n) { int i, data, tmp, max; for (data = n;data > 1; --data) { //最大値をまずいちばん外側に設定 max = data; for (i = 0; i < data - 1; ++i) { if( sai[i] > sai[max]) { max = i; } } tmp = sai[data]; sai[data] = sai[max]; sai[max] = tmp; } return 0; }
int selection_sort(int sai[], int n) { int i, data, tmp, max; for (data = n;data >= 1; --data) { //最大値をまずいちばん外側に設定 max = data; for (i = 0; i <= data - 1; ++i) { if( sai[i] > sai[max]) { max = i; } } tmp = sai[data]; sai[data] = sai[max]; sai[max] = tmp; } return 0; }
#include <stdio.h> #include <stdlib.h> #include <time.h> int GetRandom(int min,int max) { return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } int bubble_sort(int sai[], int n) { int i, data, tmp; /* data: 整列する必要があるデータ数。 */ for (data = n; data > 1; --data) { /* i: 現在比較中のデータペアの左側を示す */ for (i = 0; i < data - 1; ++i) { /* 比較 */ if (sai[i] > sai[i+1]) { /* 間違っていたので交換 */ tmp = sai[i]; sai[i] = sai[i+1]; sai[i+1] = tmp; } } } return 0; } int selection_sort_max(int sai[], int n) { int i, data, tmp, max; for (data = n;data >= 1; --data) { //最大値をまずいちばん外側に設定 max = data; for (i = 0; i <= data - 1; ++i) { if( sai[i] > sai[max]) { max = i; } } tmp = sai[data]; sai[data] = sai[max]; sai[max] = tmp; } return 0; } int selection_sort_min(int sai[], int n) { int i, data, tmp, min; for (data = n;data >= 1; --data) { //最小値をまずいちばん外側に設定 min = data; for (i = 0; i <= data - 1; ++i) { if( sai[i] > sai[min]) { min = i; } } tmp = sai[data]; sai[data] = sai[min]; sai[min] = tmp; } return 0; } int main(void) { srand((unsigned)time(NULL)); int sai[29], i; for(i = 0; i < 30; i++) { sai[i] = GetRandom(0, 100); } for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } puts("\n\nバブルソート開始…\n"); bubble_sort(sai, 30); for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } printf("\n\n次の変数だ!\n\n"); for(i = 0; i < 30; i++) { sai[i] = GetRandom(0, 1000); } for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } selection_sort_max(sai, 30); puts("\n\n選択ソート(最大値選択)開始…\n"); for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } printf("\n\n次の変数だ!\n\n"); for(i = 0; i < 30; i++) { sai[i] = GetRandom(0, 1000); } for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } selection_sort_min(sai, 30); puts("\n\n選択ソート(最小値選択)開始…\n"); for(i = 0; i < 30; i++ ) { printf("%d ",sai[i]); } return 0; }