冒泡排序算法(一)
程序设计 = 数据结构 + 算法
一个好的算法往往可以极大的提高代码的运行效率,本篇我们将介绍一下排序算法中较为简单并且实用的冒泡排序
一、算法演示
二、算法分析
从上图我们可以看出冒泡排序的核心在于
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。那么最后的元素应该会是最大的数。也就是说在每一轮排序之后都会得到一个最大的数,所以我们理所当然的就会想到既然每次排序都会得到一个最大的数,那么我就让他排序的次数等于数组长度数,也就是说数组里有多少个元素我就让他排多少次,从而我们可以将每次得到的最大数找到,也就完成了排序。
- 我们知道每次排序都会得到一个最大数,那么既然得到了最大数也就意味着我们只要注重于去掉这个最大数的数组排序就好了。
三、Java实现
class MaoPaoSort {
void maoPaoSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) { //当确定了array.length - 1个最大值后,也就确定了整个数组的排序。
for (int j = 0; j < array.length - 1- i; j++) {
if (array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
}
import java.util.Arrays;
public class Sort {
public static void main(String[] args) {
int[] ints = {2,34,4,55,88};
MaoPaoSort maoPaoSort = new MaoPaoSort();
maoPaoSort.maoPaoSort(ints);
System.out.println(Arrays.toString(ints));
}
}
四、运行结果及分析
虽说冒泡排序是一个简单的排序算法,但是很多时候不经意间容易犯这样一个错误。
首先我们来查看一下控制台爆出的错误信息
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
很明显是数组下标越界了,为什么会出现这样一个错误哩,大家请看这里
如上图所示我们可以看到第二层循环在交换相邻元素时上界是数组长度-i,我们假设目前程序运行是第一层循环的第一次循环即i=0,那么我们可以得到此时第二层循环的上界是数组长度array.length我们假设是5,当j=4后第二层循环进入最后一次循环,此时array[j+1]=array[5]。可是我们的数组长度是5也就意味着我们数组最大下标是4,因为数组是从下标0开始计数的,此时array[5]就发生了数组下标越界现象。
解决办法
为了不让下标越界我们将j的下标上界设置为array.length-1-i。同样以i=0为例,第一层循环进行第一次循环运行时,第二层循环(实际操作相邻元素互换)的上标为array.length-1,当数组长度为5时,上标为4,j=3时进入此时第二层循环的最后一次循环,实现互换array[3]和array[4]的功能,即互换了最后相邻两个元素的值。