C#デリゲートとバブルソート拡張機能

1.バブルソートの原則

  1. 配列の行があるとします。最初の配列から始めて、次の数と比較します。次の数がこの数よりも小さい場合は、2つの数の位置を入れ替えます。

  2. したがって、2番目の数値は最初の数値よりも大きくなければなりません。次に、2番目の番号と3番目の番号の比較を続け、同じ交換を実行して、このプロセスを最大n回繰り返します。

  3. n回比較すると、n番目の位置の数が最大でなければならないことがわかります。上記の手順1、2を繰り返しますが、n番目は前の手順で最大であることがわかっているため、今回はn-1番目とn番目を比較する必要はありません。このことから、バブルソートの複雑さは、O(n2)であるBig O表記では(1 + 2 + 3 +……+ n)であると推測できます。

2.バブルソートの最適化

比較の過程で、配列が21345678であると仮定します。この時点で、外側のループは3回しか実行されていません。実際には、4回実行する必要があります。データから、それだけであることがわかります。 2と1を組み合わせるには、もう一度実行する必要があります。位置を逆にすることができ、残りの3回は完全に冗長な比較操作です。

外側のループにブールフラグを追加できます。内側のループが交換なしでのみ比較されたことが判明すると、外側のループからジャンプします。コードは以下のように表示されます

   //冒泡排序算法
        public static void buddle(int[] arrays)
        {
            //冒泡优化
            for (int i = 0; i < arrays.Length; i++)
            {
                bool isChange = false;
                for (int j = 0; j < arrays.Length - i - 1; j++)
                {
                    if (arrays[j] > arrays[j + 1])
                    {
                        int temp;
                        temp = arrays[j];
                        arrays[j] = arrays[j + 1];
                        arrays[j + 1] = temp;
                        isChange = true;
                    }
                }
                if (!isChange)
                {
                    break;
                }
            }
        }

3.汎用+デリゲート拡張バブルソート

上記のバブルソートは数値のみをソートでき、任意のタイプを比較することはできません。任意のタイプのオブジェクトを比較するには、バブルソートアルゴリズムを拡張するためのジェネリック+デリゲートが必要です。

ジェネリック+委任アルゴリズムを改善します。

 public static void CommonBuddle<T>(T[] dataArrays, Func<T, T, bool> compareFuc)
        {
            //冒泡优化
            for (int i = 0; i < dataArrays.Length; i++)
            {
                bool isChange = false;
                for (int j = 0; j < dataArrays.Length - i - 1; j++)
                {
                    if (compareFuc(dataArrays[j], dataArrays[j + 1]))
                    {
                        T temp;
                        temp = dataArrays[j];
                        dataArrays[j] = dataArrays[j + 1];
                        dataArrays[j + 1] = temp;
                        isChange = true;
                    }
                }
                if (!isChange)
                {
                    break;
                }
            }
        }

スタッフカテゴリー:

   public class Employ
    {
        public string Name { get; private set; }
        public int Salary { get; private set; }
        public Employ(string name, int salary)
        {
            this.Name = name;
            this.Salary = salary;
        }
        public static bool compareFuc(Employ a, Employ b)
        {
            //比较两个员工的工资大小
            if (a.Salary > b.Salary) return true;
            return false;
        }
        public override string ToString()
        {
            return Name + ":" + Salary;
        }
    }

テスト:

  public static Employ[] employs = new Employ[]
        {
            new Employ("lei",12),
            new Employ("ledi",34),
            new Employ("lefi",564),
            new Employ("leig",23),
            new Employ("leri",4),
            new Employ("lhei",9),
            new Employ("lhei",45),
        };
        public static void Main(string[] args)
        {
            buddle(arrays);
            for (int i = 0; i < arrays.Length; i++)
            {
                Console.WriteLine(arrays[i]);
            }

            CommonBuddle<Employ>(employs, Employ.compareFuc);

            foreach(var emply in employs)
            {
                Console.WriteLine(emply);
            }

            Console.ReadKey();
        }

おすすめ

転載: blog.csdn.net/woshihaizeiwang/article/details/115180436