冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),一次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前向后移动,就像水滴下的气泡逐渐上升。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个表示flag判断元素是否进行过交换。从而减少不必要的比较。
我们举一个具体的例子来说明,将原始数组:3,9,-1,10,20。使用冒泡排序法将其排成一个从小到大的有序数列。
(1) 3,9,-1,10,20 //如果相邻的元素逆序就交换
(2) 3,-1,9,10,20
(3) 3,-1,9,10,20
(4)3,-1,9,10,20
(1) -1,3,9,10,20°
(2) -1,3,9,10,20
(3) -1,3,9,10,20
(1) 1,3,9,10,20
(2) -1,3,9,10,20
(1) -1,3,9,10,20
(1)一共进行数组的大小—1次大的循环
(2) 每一趟排序的次数在逐渐的减少
(2) 如果我们发现某趟排序中,没有发生一次交换,可以提前结束冒泡排序。
那么接下来代码演示一下,最基础的冒泡排序:
public class BubbleSort
{
public static void Sort(int[] array)
{
//临时变量
int temp = 0;
for (int i = 0; i < array.Length-1; i++)
{
for (int j = 0; j < array.Length - 1 - i; j++)
{
//如果前面的数比后面的数大,则交换
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
Console.WriteLine(string.Join(' ', array));
}
}
运行:
static void Main(string[] args)
{
int[] array = { 3,9,-1,10,20 };
BubbleSort.Sort(array);
Console.Read();
}
上面只是简单的实现了冒泡排序,大家可以发现后面几次根本没有再次发生交换白白运行了几次,那么接下来继续优化这个算法。
代码:
public static void Sort(int[] array)
{
//临时变量
int temp = 0;
//标识变量,表示是否进行过交换
bool flag = false;
for (int i = 0; i < array.Length-1; i++)
{
for (int j = 0; j < array.Length - 1 - i; j++)
{
//如果前面的数比后面的数大,则交换
if (array[j] > array[j + 1])
{
flag = true;
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
//在一趟排序中,一次交换都没有发生过则直接break
if (!flag)
{
break;
}
else
{
//充值flag,进行下次判断
flag =false;
}
Console.WriteLine(string.Join(' ', array));
}
}
运行:
static void Main(string[] args)
{
int[] array = { 3,9,-1,10,20 };
BubbleSort.Sort(array);
Console.Read();
}