2

私はバブルソートの演習を行っていますが、私の感覚では、それは正しいものに非常に近いものです. 今のままでは、永遠のループが提示されます。

障害はどこにありますか?

static void Main(string[] args)
    {
        int[] numbers = { 2, 4, 8, 5, 88, 55, 32, 55, 47, 8, 99, 120, 4, 32 };
        int temporary;
        bool sorted;
        do
        {
            sorted = false;

            for (int i = 0; i < numbers.Length - 1; i++)
            {
                int a = numbers[i];
                int b = numbers[i + 1];
                if (a > b)
                {
                    temporary = a;
                    a = b;
                    b = temporary;

                    sorted = true;

                }
            }
            Console.WriteLine("sorted");
        } while (sorted == true);


        foreach (int i in numbers)
        {
            Console.Write(i + " ");
        }

    }
4

5 に答える 5

4

C# でのより良いアプローチは、一般的なバブル ソートを使用することです。

public void BubbleSort<T>(IList<T> list);
{
    BubbleSort<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;
        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++;
    }
}

このアルゴリズムの簡単な説明は、Jon Skeet の回答で提供されています。「任意の比較子を使用しますが、省略できます。その場合、デフォルトの比較子が関連する型に使用されます。配列を含む IList の (読み取り専用ではない) 実装を並べ替えます。」

これが役立つことを願っています。

于 2012-12-06T09:21:35.603 に答える
3

と交換abますが、入力配列には何もしません。したがって、メモリ内の値を常に交換していますが、元の配列は変更されていません。試す:

            for ( int i = 0; i < numbers.Length - 1; i++ )
            {
                if ( numbers[i] > numbers[i + 1] )
                {
                    temporary = numbers[i];
                    numbers[i] = numbers[i + 1];
                    numbers[i + 1] = temporary;

                    sorted = true;

                }
            }
于 2012-12-06T09:21:39.577 に答える
2

結果を配列に書き戻していません。

代わりにこれを使用してください:

//temporary = a;
//a = b;
//b = temporary;

numbers[i] = b;
numbers[i + 1] = a;
于 2012-12-06T09:21:06.177 に答える
1

そのはず

if (numbers[i] > numbers[i + 1])
    {
            temporary = numbers[i];
            numbers[i] = numbers[i + 1];
            numbers[i + 1] = temporary;

            sorted = true;

     }

で行われた変更は に反映さabません。なぜなら、a と bはnumbers[i] numbers[i+1]単なる..copynumbers[i] numbers[i+1]

于 2012-12-06T09:21:17.533 に答える
1

これが実際の例です:

static void Main(string[] args)
{
    int[] numbers = { 2, 4, 8, 5, 88, 55, 32, 55, 47, 8, 99, 120, 4, 32 };
    int temporary;
    bool sorted;

    do
    {
        sorted = false;
        for (int i = 0; i < numbers.Length - 1; i++)
        {
            if (numbers[i] > numbers[i + 1])
            {

                temporary = numbers[i];
                numbers[i] = numbers[i + 1];
                numbers[i + 1] = temporary;

                sorted = true;
            }
        }
        Console.WriteLine("sorted");
    } while (sorted == true);

    foreach (int i in numbers)
    {
        Console.Write(i + " ");
    }
}
于 2012-12-06T09:25:33.487 に答える