思想:前一项与后一项比较,如果前一项大于后一项,两者交换位置
如有数组ary[4,3,5,2,1]
第一轮:
4>3 —>交换 [3,4,5,2,1]
4<5 —>不交换 [3,4,5,2,1]
5>2 —>交换 [3,4,2,5,1]
5>1 —>交换 [3,4,2,1,5]
第一轮比较完后结果将最大的数放在最后一位,且比较次数为4
第二轮
3<4 —>不交换 [3,4,2,1,5]
4>2 —>交换 [3,2,4,1,5]
4>1 —>交换 [3,2,1,4,5]
第二轮比较完后结果将第二大的数放在倒数第二位,且比较次数为3
第三轮
3>2 —>交换 [2,3,1,4,5]
3>1 —>交换 [2,1,3,4,5]
第三轮将第三大的数放在倒数第三位,比较次数为2
第四轮
2>1 —>交换[1,2,3,4,5]
每一轮比较完,将最大的那个数放在后面,上述数组有5项,只需比较4轮
由此知最多需要比较轮数为arr.length-1
每一轮比较次数
i代表轮数 i=0 i<length-1
->j每一轮比较的次数
i=0 第一轮 4 ary.length-1-0 不用和自己比
i=1 第二轮 3 ary.length-1-1 不用和自己比前面重复比较过一次(前一轮最大的数放在最后)
i=2 第三轮 2 ary.length-1-2 不用和自己比前面重复比过两次(前两轮最大的两个数放在最后)
i=3 第四轮 1
…
每一轮比较次数:ary.length-1-i
代码实现
static void bubbleSort(int[]arr){
int temp;
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;//交换顺序
}
}
}
}
冒泡排序优化
由于排序过程中可能会出现在其中某一轮已经排序好了,但是数组还是会继续排序,此时
会进行不必要的操作
解决方法:
对于数组ary[4,3,5,2,1],在每一轮比较前设置一个变量flag=false
第一轮:
4>3 —>交换 [3,4,5,2,1]
4<5 —>不交换 [3,4,5,2,1]
5>2 —>交换 [3,4,2,5,1]
5>1 —>交换 [3,4,2,1,5]
只要有交换的地方flag=true
第二轮开始前令flag=false
第二轮
…重复上述操作
优化后的代码
static void bubbleSort(int[]arr){
int temp;
boolean flag=false
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=true;//有交换flag=true
}
if(flag){
flag=false;//上一轮有交换,下一轮开始前将flag设置为false
}
else{
break;//上一轮没有交换,说明排序已经完成结束循环
}
}
}
}