什么是冒泡排序?
冒泡排序就是数组里面的元素从左往右两两依次进行大小对比,如果是升序则把大的元素和小的元素位置调换,最后实现升序排序,降序反之。
如何实现冒泡排序(升序)?
把冒泡排序简单来看就是多次遍历把最大元素放最后放也就是多次升序排序
第一次排序:
public class BubbleSort {
public static void main(String[] args) {
int[] array = {98,92,88,77,63,55};
//升序排序
for (int i = 0; i < array.length; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
运行结果:
分析报错原因:ArrayIndexOutOfBoundsException是常见的数组下标越界的错误,这是因为array.length数组的长度为6对应下标最大值为array[5],当for循环执行第五次的时候arrry[i]是array[5]是ok的,但是array[i+1]却是array[6]故报错
解决办法:
array.legth -1
public class BubbleSort {
public static void main(String[] args) {
int[] array = {98,92,88,77,63,55};
//升序排序
for (int i = 0; i < array.length-1; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
运行结果:
重复升序排序
int[] array = {98,92,88,77,63,55};
//升序排序
for (int i = 0; i < array.length-1; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length-2; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length-3; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length-4; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
for (int i = 0; i < array.length-5; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
}
}
运行结果:
此时已完成升序的冒泡排序但是有太多的重复代码,观察发现数组长度为6只需总体排序五次,可用for循环简化
for (int j = 0; j < array.length-1; j++) {
...
}
将升序代码放入其中
//冒泡排序
for (int j = 0; j < array.length-1; j++) {
for (int i = 0; i < array.length-1; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
运行结果:
但是但是这不是最优的写法,为什么呢?由上面代码可以看出第二次for循环每每都执行了arry.length-1次,这是不合理的会造成资源浪费,因为每执行一次都会将最大值移置数组后面,比较元素少了一个 ,因此比较次数应该随着排序次数而减小。六个元素比较五次,五个元素比较四次…
优化后的写法:
for (int j = 0; j < array.length-1; j++) {
for (int i = 0; i < array.length-1-j; i++) {
if (array[i]>array[i+1]){
int temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}