这里为Java初学者介绍一下冒泡排序。其实不管是什么语言,其中的思想都是一样的。
冒泡排序的思路:将一组数据从前往后排列,两两相邻数之间比较大小,如果前一个数大于(小于)后一个数,两者互换位置,否则不变。位置第1个和位置第2个比较之后,位置第2个和位置第3个再比较,依此类推。
举例:一组数据 32,54,12,39,47 从小到大冒泡排序
第一轮:
32 < 54,位置不变;32,54,12,39,47
54 > 12,交换位置;32,12,54,39,47
54 > 39,交换位置;32,12,39,54,47
54 > 47,交换位置;32,12,39,47,54
(可以确定这组数据最大数是最末位置的54)
第二轮:
32 > 12,交换位置;12,32,39,47,54
39 > 32,位置不变;12,32,39,47,54
47 > 39,位置不变;12,32,39,47,54
因为已知54是最大数,所以47没必要再和54做比较了。
(可以确定这组数据第二大数是倒二位置的47)
……
由此我们可以推出,第三轮比较两次,第四轮比较一次。得到最终结果。但是从举出的例子来看, 在第二轮第一次排序之后,我们已经得到了想要的结果,因此后面的操作就显得有些累赘,这就需要我们对代码进行再优化。
代码优化前:
int[] arrs = {32,54,12,39,47};
int temp = 0;//临时寄存数据
for(int i = 0; i < arrs.length - 1; i++)//外循环表示第几轮
{
for(int j = 0; j < arrs.length - 1 - i; j ++)//内循环表示第几次,建议初学者先从内循环理解,再套入外循环
{
if(arrs[j] > arrs[j + 1])//比较大小,交换位置
{
temp = arrs[j];
arrs[j] = arrs[j + 1];
arrs[j + 1] = temp;
}
}
System.out.println("\n==第" + (i + 1) + "轮==");
for(int j = 0; j < arrs.length;j++)//输出第(i+1)轮排序后的结果
{
System.out.print(arrs[j] + "\t");
}
}
代码优化后:
int[] arrs = {32,54,12,39,47};
int temp = 0;
for(int i = 0; i < arrs.length - 1; i++)
{
int flag = 0;//在变化后回到原来的值
for(int j = 0; j < arrs.length - 1 - i; j ++)
{
if(arrs[j] > arrs[j + 1])
{
temp = arrs[j];
arrs[j] = arrs[j + 1];
arrs[j + 1] = temp;
flag++;
}
}
if (flag == 0)//设置一个开关,如果flag没有变化,则数据这一轮没有变化,判定已经排序完成,跳出循环
{
System.out.println("\n排序结束!!");
break;
}
System.out.println("\n==第" + (i + 1) + "轮==");
for(int j = 0; j < arrs.length;j++)
{
System.out.print(arrs[j] + "\t");
}
}
以上就是冒泡排序的全部内容了,各位看官若觉得阅读愉快,不妨留个赞吧!