1.バブルソートの原則
-
配列の行があるとします。最初の配列から始めて、次の数と比較します。次の数がこの数よりも小さい場合は、2つの数の位置を入れ替えます。
-
したがって、2番目の数値は最初の数値よりも大きくなければなりません。次に、2番目の番号と3番目の番号の比較を続け、同じ交換を実行して、このプロセスを最大n回繰り返します。
-
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();
}