前奏
是相当于一种时间复杂度中的平方阶概念的数组排序算法
思路
思路:
1:创建2个循环一个外循环是循环长度-1次每循环依次比较出指定索引范围里最大值
2:内层循环以最开始元素与相依元素比较大小如果后元素比前元素小交换位置
3:每次将本次循环最大值比较出来放到后面元素位置上,下次就无需比较该当前最大位置所以最大长度-1-外循环索引 以此类推
注意:内循环的最大数是长度在-1只要当前元素是倒数第二个元素比较最后一个元素为最后一次比较
不然当前元素就是末尾元素比较下一个就会索引越界
优化:如果本次循环相依元素比较大小直到结束没有交换过任何一个元素原位置就代表当前已经是排好序的数组了
总结:数组长度设为n。外层共循环了n-1次,外层循环增加一次,对应内层循环就 减少一次。
课外仅供参考
1. 如果与一组8000个数据的数组排序的情况下 时间差不多120--150毫秒之间
2. 如果与一组80000个数据的数组排序的情况下 时间差不多10秒到13秒之间
3. 如果与一组800000个数据的数组排序的情况下 时间应该至少十几分钟
图解 1
冒泡排序的基本思想是,对相邻的元素进行两两比较,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序
图解 2
第一次循环:此次循环的多次比较交换,使最大的数字8冒到最上面。
第二次循环:此次循环中的多次比较和交换,使7往上冒,最终排到倒数第二个位置。
你会发现,这次循环比前面少一次循环比较。
这是因为第一次循环时已经把最大的8排到最上面的位置了,这次排序肯定不会去占用最上面的位置的,所以此时比较次数可以比前面少一次。
第三次循环:同理,此时6会往上冒。比较次数同理又会比前面少一次。
此时看着最后的结果已经是从小到大了,这是因为在原始数组中,5就在4的上面。
但实际我们不知道5是在4的上面,我们就得继续完成最后一次循环比较。
第四次循环: 5已经排在4的上面了,比较后不交换。
代码 提示:如果将从小到大顺序变成从大到小顺序,改对应的将> 改成<
//冒泡排序版本4
public static void bubbleSortVersion4(int [] sort){
//创建变量用作于2个元素进行之间的赋值交换
int temp;
//创建一个标志用作于判断是否已经是排序好的数组
boolean flag=true;
for(int i=0;i<sort.length-1;i++){
//执行本次循环比较出指定索引元素范围内的最大值,由于是两两比较索引当前循环到是每次有效索引的第二个即可不然会出现索引越界
for(int j=0;j<sort.length-1-i;j++){
//如果当前索引元素大于当前索引+1元素就进行交换位置
if(sort[j]>sort[j+1]){
temp=sort[j+1];
sort[j+1]=sort[j];
sort[j]=temp;
flag=false;
}
}
if(false){
break; //说明当前数组已经是排好序的无需再比较跳出即可
}else{
flag=true; //重新修改标志用作于下次比较
}
}
}