public enum EChangeType
{
///
/// 用第三方变量temp进行前后值交换
///
ThridVar,
///
/// 用a=a+b;b=a-b;a=a-b 计算方法进行前后值交换
///
Js,
///
/// 用a=a^b;b=a^b;a=a^b 计算方法进行前后值交换
///
XOR
}///
/// 冒泡排序算法:
/// a、首先将所有待排序的数字放入工作列表中
/// b、从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换
/// c、重复2号步骤,直至再也不能交换
///
public class BubbleSort
{
public void Sort(int[] arrInt, EChangeType type)
{
System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
st.Start();
int count = 0;
int temp;
bool hasExchangeAction; //记录此次大循环中相邻的两个数是否发生过互换(如果没有互换,则数组已经是有序的)
for (int i = 0; i < arrInt.Length - 1; i++)
{
count++;
hasExchangeAction = false; //每次大循环都假设数组有序
for (int j = i + 1; j < arrInt.Length; j++)
{
count++;
if (arrInt[i] > arrInt[j])
{
switch (type)
{
case EChangeType.ThridVar:
temp = arrInt[i];
arrInt[i] = arrInt[i + 1];
arrInt[i + 1] = temp;
break;
case EChangeType.Js:
arrInt[i] = arrInt[i] + arrInt[j];
arrInt[j] = arrInt[i] - arrInt[j];
arrInt[i] = arrInt[i] - arrInt[j];
break;
case EChangeType.XOR:
arrInt[i] = arrInt[i] ^ arrInt[j];
arrInt[j] = arrInt[i] ^ arrInt[j];
arrInt[i] = arrInt[i] ^ arrInt[j];
break;
default:
break;
}
hasExchangeAction = true; //发生过互换
}
}
if (!hasExchangeAction) //如果没有发生过互换,则数组已经是有序的了,跳出循环
{
break;
}
}
st.Stop();
switch (type)
{
case EChangeType.ThridVar:
Console.WriteLine("用第三方变量temp进行前后值交换:");
break;
case EChangeType.Js:
Console.WriteLine("用a = a + b; b = a - b; a = a - b;(或a = a - b; b = a + b; a = b - a;) n计算方法进行前后值交换:");
break;
case EChangeType.XOR:
Console.WriteLine("用a = a ^ b; b = a ^ b; a = a ^ b; 计算方法进行前后值交换:");
break;
default:
break;
}
Console.WriteLine("循环总数:{0} 排序耗时:{1}{2}", count, st.ElapsedMilliseconds,Environment.NewLine);
}
}
static void Main(string[] args)
{
List list = new List();
for (int i = 100 * 100; i >= 0; i--)
{
list.Add(i);
}
Console.WriteLine("对100 * 100个数字进行冒泡排序{0}", Environment.NewLine);
new BubbleSort().Sort(list.ToArray(), EChangeType.ThridVar);
new BubbleSort().Sort(list.ToArray(), EChangeType.Js);
new BubbleSort().Sort(list.ToArray(), EChangeType.XOR);
Console.ReadLine();
}结果
|