在java的许多程序设计中,通常需要对数列按序排列,冒泡排序是常见的排序方法之一。
冒泡排序(Bubble sort)是指依次比较相邻的两个数,将最大或最小的那个数放在后面,工作原理如下:
(1)比较第一个数和第二个数,将小的放在前面,大的放在后面。
(2)比较第二个和第三个数,将小的放在前面,大的放在后面。
(3)使用(1)(2)中的方法继续向下比较,直到比较到最后两个为止,此时第一轮结束,所有的数中最大的被放到了最后面。
(4)重复步骤(1)(2)(3)从第一对数 进行比较(可能由于第二个数和第三个数的交换使第二个数不再大于第一个数,)在倒数第二的位置上得到剩余数字的最大数。
(5)重复比较过程,直到完成排序。
核心代码如下:
// 冒泡排序
public static void bubbleSort(int[] array)
{
for (int i = 0; i < array.length - 1; i++)
{
for (int j = 0; j < array.length - i - 1; j++)
{
if (array[j] > array[j + 1])
{
swap(array, j,j+1);
}
}
}
}
这样就实现了冒泡排序,其实这个排序可以进行一些优化的,当执行完上面的步骤(3)后,如果上面的排序中所有的数都是按顺序排列的,那么就不需要继续向下比较了,可以直接跳出循环。这时就需要一个标记flag来实现。代码如下:
// 冒泡排序优化
public static void bubbleSort(int[] array)
{
boolean flag=true;
for (int i = 0; i < array.length - 1&&flag; i++)
{
flag=false;
for (int j = 0; j < array.length - i - 1; j++)
{
if (array[j] > array[j + 1])
{
swap(array, j,j+1);
flag=true;
}
}
}
}
上面代码中flag=true,进入外循环后flag=false,当有数据需要交换时才设置flag=true;
如果第一轮比较后数组就完成了升序排列,那么进入第二轮循环后flag=false,没有数据在进行交换,那么i++之后flag=false,程序结束。
运行结果如下:
排序后的数组是:
[-16,-2,0,3,5,9,18,25,29,41]
更多内容在java经典算法排序汇总。