なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

各種ソート練習

バブルソート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;
}