5

これはきれいにできますか?

using System;  
class AscendingBubbleSort 
{     
    public static void Main()
    {
        int i = 0,j = 0,t = 0;
        int []c=new int[20];
        for(i=0;i<20;i++)
        {
            Console.WriteLine("Enter Value p[{0}]:", i);
            c[i]=int.Parse(Console.ReadLine());
        }
        // Sorting: Bubble Sort
        for(i=0;i<20;i++)
        {
            for(j=i+1;j<20;j++)
            {
                if(c[i]>c[j])
                {
                    Console.WriteLine("c[{0}]={1}, c[{2}]={3}", i, c[i], j, c[j]);
                    t=c[i];
                    c[i]=c[j];
                    c[j]=t;
                }
            }
        }
        Console.WriteLine("bubble sorted array:");
        // sorted array output
        for(i=0;i<20;i++)
        {
            Console.WriteLine ("c[{0}]={1}", i, c[i]);
        }
    }
}
4

10 に答える 10

35

そこに貼り付けたのはバブルソートではありません。これは一種の「ブルート フォース」ソートですが、バブル ソートではありません。一般的なバブル ソートの例を次に示します。任意の比較子を使用しますが、省略できます。その場合、関連する型にデフォルトの比較子が使用されます。IList<T>配列を含むの (読み取り専用ではない) 実装を並べ替えます。上記のリンク (ウィキペディアへ) を読んで、バブル ソートがどのように機能するかを理解してください。各ループで最初から最後までどのように通過するかに注意してください。ただし、各アイテムをその隣のアイテムと比較するだけです。これはまだ O(n 2 ) ソート アルゴリズムですが、多くの場合、指定したバージョンよりも高速になります。

public void BubbleSort<T>(IList<T> list)
{
    BubbleSort<T>(list, Comparer<T>.Default);
}

public void BubbleSort<T>(IList<T> list, IComparer<T> comparer)
{
    bool stillGoing = true;
    while (stillGoing)
    {
        stillGoing = false;
        for (int i = 0; i < list.Count-1; i++)
        {
            T x = list[i];
            T y = list[i + 1];
            if (comparer.Compare(x, y) > 0)
            {
                list[i] = y;
                list[i + 1] = x;
                stillGoing = true;
            }
        }
    }
}
于 2009-10-20T15:07:14.697 に答える
13

C# でソートする最もエレガントな方法は次のとおりです。

Array.Sort( object[] )

これは、教師が非エレガントなバブル ソート アルゴリズムを実装するように求めた宿題の問題を除いて、どこでも機能します。;-)

于 2009-10-20T15:04:53.283 に答える
8

全体として、バブル ソートの実装に問題はありません。実際のコード レビューを行う場合、次の変更を行います。

よりわかりやすい変数名を選択してください

なぜあなたの配列は単に呼ばれているのcですか?

変数のスコープを最小限に抑える

すべての変数は、関数の先頭で宣言されています。これが宿題の要件またはコーディング標準でない限り、変数が使用される場所に「近い」変数を宣言するのがより慣用的であり、可能な限り最小のスコープを持つことが望ましいです。

したがって、最初の行を削除しますint i = 0,j = 0,t = 0;。ループ カウンターをインラインで宣言します。

for(int i = 0; i < 20; i++)

そして、使用されている場所で一時変数を宣言します。

                Console.WriteLine("c[{0}]={1}, c[{2}]={3}", i, c[i], j, c[j]);
                int t=c[i];
                c[i]=c[j];
                c[j]=t;

ハードコーディングされた配列境界を排除します。

これ:

for(i=0;i<20;i++)

これになります:

for(i = 0; i < c.Length; i++)
于 2009-10-20T15:08:33.133 に答える
3

ほとんどの人は、バブルソートをエレガントにしようとは思いません。ただし、一般的には、これを行うことがわかります:

for (int i = 0; i < items.Length; i++) {
    Item item = items[i];
    // do something with item
}

これを行うよりもエレガントでメンテナンスしやすいです:

Item item;
int i;
for (i = 0; i < items.Length; i++) {
    item = items[i];
    // do something with item
}

つまり、適用可能な最小のスコープ内で変数を宣言します。そうしないと、コードを使用して、iまたはitemコード内の他の場所で何かを行ってから、本来あるべきではない場所でそれらを再度使用していることに気付く可能性があります。

于 2009-10-20T15:08:04.907 に答える
2
  • swap メソッドを使用して、2 つの配列項目を交換します。(swapメソッドの書き方の詳細は宿題に!)

  • すでに商品が揃っている場合を考えるべき

  • より多くのマークについては、挿入ソートを読む必要があります:-)

  • キーボードからテスト データを読み取るのではなく、nUnit の使用方法を学習できるかどうかを確認します。

于 2009-10-20T15:05:56.447 に答える
1
    public int[] BubbleSortInAesc(int[] input)
    {
        for (int i = input.Length; i > 0; i--)
        {
            for (int j = 0; j < i-1; j++)
            {
                if (input[j] > input[j + 1])
                {
                    //Swap the numbers
                    input[j] = input[j + 1]+input[j];
                    input[j + 1] = input[j] - input[j + 1];
                    input[j] = input[j] - input[j + 1];
                }
            }
        }
        return input;
    }
于 2013-03-18T04:29:38.510 に答える
1

私は個人的にこれを好みます:

string foo [] = new string[] {"abc", "def", "aaa", "feaf", "afea" };
Array.Sort(foo);

しかし、それは私だけです。並べ替えは解決済みの問題ですが、なぜ車輪を再発明するのでしょうか?

于 2009-10-20T14:59:49.930 に答える
1
int[] array = {4,5,7,1,8};           

int n1, n2;
bool stillgoing = true;

while (stillgoing)
{
    stillgoing = false;
    for (int i = 0; i < (array.Length-1); i++)
    {                  
        if (array[i] > array[i + 1])
        {
            n1 = array[i + 1];
            n2 = array[i];

            array[i] = n1;
            array[i + 1] = n2;
            stillgoing = true; 
        }
    }
}
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}

Jon skeet からいくつかのアイデアをもらいました...

于 2013-03-02T15:55:19.380 に答える
1

Jon Skeetによって提案された回答には改善があると思います。各ループの後、反復回数は、前の反復で処理された最後のアイテムを除外する必要があります。コードは次のとおりです。

public void BubbleSortImproved<T>(IList<T> list)
{
    BubbleSortImproved<T>(list, Comparer<T>.Default);
}

public void BubbleSortImproved<T>(IList<T> list, IComparer<T> comparer)
{
    bool stillGoing = true;
    int k = 0;
    while (stillGoing)
    {
        stillGoing = false;
        //reduce the iterations number after each loop
        for (int i = 0; i < list.Count - 1 - k; i++)
        {
            T x = list[i];
            T y = list[i + 1];
            if (comparer.Compare(x, y) > 0)
            {
                list[i] = y;
                list[i + 1] = x;
                stillGoing = true;
            }
        }
        k++;
    }
}
于 2012-12-06T10:57:58.673 に答える
0

あなたのアルゴリズムは問題ないと思いますが、ソート機能を別のクラスとメソッドに入れます。

于 2009-10-20T15:01:25.637 に答える