読者です 読者をやめる 読者になる 読者になる

アルゴリズム バブルソート編

JAVAの本で非常にいいこと書いてあったので、引用

 

アルゴリズムとは、

プログラミングとは、プログラミング言語の文をいくつも組み合わせてPCに支持することです。

 

逆に言ううならば

文の組み合わせで表現できるならば、プログラミングは可能。

となる。

 

アルゴリズムのよい所は、経験やセンスに頼らず、全く同じ結果を出せる所。

 

 

blog.codebook-10000.com

blog.codebook-10000.com

using System;

class Bubble
{
    static void Main()
    {
        int[] nums = { 333, 23, 576, 569, 384, 758, 978, 123, 432, 657, 598 };
        int start,end,tmp;

        Console.Write("元の配列:");
        for (int i = 0; i < nums.Length; i++)
        {
            Console.Write(" " + nums[i]);
        }
        Console.WriteLine();

        for (start = 1; start < nums.Length; start++)
        {
            for (end = nums.Length-1; end >= start; end--)
            {
                if (nums[end - 1] > nums[end])
                {
                    tmp = nums[end - 1];
                    nums[end - 1] = nums[end];
                    nums[end] = tmp;
                }
            }
        }

        Console.Write("ソート後の配列:");
        for (int i = 0; i < nums.Length; i++)
        {
            Console.Write(" " + nums[i]);
        }
        Console.WriteLine();
    }
}

バブルソート

↑参考

そもそもバブルソートとは

(昇順の場合)

並んでる数値の最初を基準に、右側を大きいか、小さいかで判断。

自分の数値より大きければそのまま、小さければ左に。

これを繰り返すと、数値の大きさ順になる

 

 

Console.WriteLine() と Console.Write() の違い

detail.chiebukuro.yahoo.co.jp



引数に指定されたデータを書き込んだ後に改行(CR+LF)を入れるか入れないかの違いです.Write()は改行を入れませんが,WriteLine()は最後に改行が挿入されます.


nums.Length;

www.javadrive.jp

 

なるほどー

class JSample6_1
{
public static void main(String args[])
    {
        int n[ ] = {18, 29, 36, 12 };
    System.out.println(n.length);
    }
}


とか記述した場合、 n[]のn[0],n[1],n[2],n[3],

の 4が 取得されると。

また
配列変数.lengthを使っておけば後で配列の要素の数が変更になった場合でも修正は必要ありません。また、数値が記述されているとなぜこの数値なのか 後から分からなくなる可能性もありますが、数値の代わりに配列変数.lengthが記述されていれば配列の長さだけ処理したかっということがはっきりと分 かります。

要するに、
途中で配列の数を変更したとしても問題がないと。
なるほどなー

 Console.WriteLine(nums.Length);

とかこんな感じで書いとくと、改行してくれて、配列の個数も取得しながらいけると。
これはありがたい。


問題はここの処理がよくわからないなー
            for (start = 1; start < nums.Length; start++)
            {

                for (end = nums.Length - 1; end >= start; end--)
                {
                    if (nums[end - 1] > nums[end])
                    {
                        tmp = nums[end - 1];
                        nums[end - 1] = nums[end];
                        nums[end] = tmp;
                    
                    }
                
                }
            }
えーと。
バブルソートはそもそも
左 と 右を 比較して、右が小さければ、入れ替える。
という処理をするので、

たとえば、 3番なら
仮に 配列2 に333 、配列3 に300が遭った場合
nums[2] > nums[3]
333>300
これで最初の if 文が発動

if 発動後は、
tmp に nums[2]の333を保存。
num[3]の数値300ををnums[2]に代入。
んで
その後、nums[3] にtmpで置いておいた数を代入。

                    if (nums[end - 1] > nums[end])
                    {
                        tmp = nums[end - 1];
                        nums[end - 1] = nums[end];
                        nums[end] = tmp;
                    
                    }

なんというか、非常に使い勝手が良さそうな処理
具体的には、昇順に並べ替える。
全般に役立ちそう。

加えて、この考え方って、配列の個数に応じて処理回数を決められるのも大きい。

かな。

纏める。
・配列の個数に応じた処理を組める
・変数1個で入れ替え処理を書ける
(具体的には)
保存
入れ替え
保存した値の入れ替え

            for (start = 1; start < nums.Length; start++)
                //ここからスタート。配列今回でいえば9回分のループ。
            {

                for (end = nums.Length - 1; end >= start; end--)

ここの処理がまだ、よくわからねー