冒泡排序
Java中有很多种排序:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。本文给大家介绍的是冒泡排序。
1、在冒泡排序中,对数组中相邻位置的元素进行两两比较,较小的数或者较大的数向后移,本文采用的是较大的数向后移。以下是冒泡排序的例子。
//冒泡排序
int[] arr1 = {5, 3, 2, 6, 1};
for (int i = 0; i <arr1.length -1 ; i++) {
for (int j = 0; j <arr1.length - 1 - i ; j++) {
if (arr1[j] > arr1[j + 1]) {
int temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
}
}
}
for (int i = 0; i <arr1.length ; i++) {
System.out.println(arr1[i]);
}
以下是排序执行过程中各数字位置的变化
第一次: 3 5 2 6 1
3 2 5 6 1
3 2 5 6 1
3 2 5 1 6
第二次: 2 3 5 1 6
2 3 5 1 6
2 3 1 5 6
第三次: 2 3 1 5 6
2 1 3 5 6
第四次: 1 2 3 5 6
在上面的例子中,我们定义了一个数组,对数组进行排序,然后按照从小到大的顺序输出数组。
我们可以看到,冒泡排序主要是由for循环嵌套以及if语句组成,for循环是根据判断条件内容来检查是否要继续执行循环,而判断条件是冒泡排序最核心的部分。
以下是关于if中代码的解释:
将数组中相邻的两个元素经济比较,较大的数向后移。
下面来解释以下两个for循环中判断条件的书写依据:
一、在第一个for循环中,i的限定条件为arr1.length-1,即数组的长度减一,这个条件是用来限定第二个循环执行的次数,从上面的数字顺序变化的结果中可以看出:在第一次内循环执行的过程中,找到了最大的那个数,依次类推,当第四次的时候,找到了第四大的数,同时也找到了最小的数,它一次性的找到了两个位置的数,就不需要第五次循环了,所以第一个for循环的限定条件为数组长度减一。
二、在第二个for循环中,arr1[3]和arr1[4]比较是第一次循环中的最后一次比较,在此次比较中会找到最大的数,在以后的比较中,最后一位就不需要再进行比较了,所以第二次循环中进行比较的数字只有四个,依次类推,每次比较的数都会少一个,即 j 最大值也依次递减,而是递增,所以是arr1.length-i,因为在下面的if判断中有arr1[j + 1]的存在,所以判定条件要再减一,否则会出现Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException,即数组越界的错误。