冒泡排序温习
Posted 原地回血
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序温习相关的知识,希望对你有一定的参考价值。
冒泡排序
1. 在数组中, 相邻的两个元素比大小, 若第一个元素比第二个元素大, 那么就交换他俩的位置
2. 每次比较, 都会产出一个最大值或者最小值
3. 那么在下一次比较时, 就可以少排一次
4. 重复循环, 直至结束
冒泡排序的时间复杂度是: O(n2)
代码
public static void main(String[] args){
int[] a = {11,12,3,2,34,56,12};
int sort = sort(a);
System.out.println(Arrays.toString(sort));
}
public static int sort(int[] array){
//临时变量
int temp = 0;
//创建一个外循环,判断要走多少次
for(int i=0;i<array.length-1;i++){
//内循环,用来比大小排序
for(int j=o;j<array.length-1-i;j++){
//判断大小
if(array[j+1]>array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return array;
}
解析:
for(int j=o;j<array.length-1-i;j++){
//判断大小
if(array[j+1]>array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
- array.length-1: 为了防止下标越界, 若不减1, 当j=6的时候, 下一行代码
array[j+1]
==array[7]
, 但数组的长度只有array[6], 所以会报错ArrayIndexOutOfBoundsException 索引越界异常 - array.length-1-i: -i是因为每次比较的时候都会在最右侧产生一个最大值和最小值, 所以在下次比较的时候倒数第二个数不用和最后一个数进行比较, 故-i
双循环
外层循环的作用:
在未排序的数组中, 将最大数排在数组的最右侧. 在第一次循环时, 将数组中的最大数交换到数组的最右侧; 第二次循环时, 将第二大的数交换到数组的次右侧, 以此类推.
内循环的作用:
冒泡排序每次循环后, 都会把大数排到最右侧, 在第三次排序的时候, 已经将两个最大数放到了最右侧, 所以不需要这两个数进行比较了, 就需要把他俩减掉, i代表着循环次数, 当i=2时,说明已经是第三次循环了, 所以需要length-i(2).
优化:
public static void main(String[] args){
int[] a = {11,12,3,2,34,56,12};
int sort = sort(a);
System.out.println(Arrays.toString(sort));
}
public static int sort(int[] array){
//临时变量
int temp = 0;
//创建一个外循环,判断要走多少次
for(int i=0;i<array.length-1;i++){
//在此处加一个标记
boolean flag = false;
//内循环,用来比大小排序
for(int j=o;j<array.length-1-i;j++){
//判断大小
if(array[j+1]>array[j]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
//如果走完循环,就更改flag
flag = true;
}
//判断,如果走完循环flag没有变为true,直接跳出循环
if(flag==false){
break;
}
}
}
return array;
}
加标记的意思: 如果这个数组本身的顺序就是对的, 那么标识就不会改变(false), 就不用在去外循环, 直接跳出循环返回即可.
两位大佬写的很好, 参考了一下:
以上是关于冒泡排序温习的主要内容,如果未能解决你的问题,请参考以下文章