//冒泡排序的原理:
个人理解:从数组的第一个数开始,两两比较,大的浮上去,每次循环确定一个最大的数,最后全部确定。
基础代码:
int []arr= {1,5,7,4,8,9};
int temp=0;
for (int i=0;i<arr.length;i++)
{
for(int j=0;j<arr.length-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//代码实现嵌套循环
//外层循环中的i是确定好的数的个数
//内层循环通过比较然后完成交换,每次实现将最大值放到最后
优化1:
for (int i=0;i<arr.length-1;i++)
外层循环可以只循环length-1次,因为当数组中n-1个数已经排好以后,最后一个已经是排好的。
优化2:
for(int j=0;j<arr.length-i-1;j++)
内层循环可以只循环length-i-1次,因为i为已经确定好了的个数,每排序一次就可以少比较i次
优化3:
//每次排序完成以后,如果数组已经是从小到大的情况,就不需要再比较了
//??检查排序完成-- 就是在一次比较过程中没有发生位移
//就是排序完成了
方法:可以加入一个flag来标识位移是否发生
优化后的代码:
int []arr= {1,5,4,7,8,9};
int temp=0;
int flag=-1;//加入一个flag来标识是否发生位移
int count=-1;
for (int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=1;//位移则改变数值
}
}
count++;
if(flag==-1)//如果没改变数值
{
System.out.println("已经不需要再排序,排序了:"+count+"次");
break;
}
flag=-1;//每次循环需要置为初值
}
for (int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}