一、基本思想: 相邻的数据进行比较,较大的数据下沉,较小的数据冒起来。
二、实现(将数组中的元素从小到达排序):
从数组的第一个元素开始,进行两个数据的比较,如果该数据,比后一个数据大则交换,一轮结束后,最大的元素会被放置到数组的末尾。
不断地重复步骤1,直到所有的数据排序完成。
Java代码实现:
import java.util.Arrays;
public class bubble_sort {
public static void main(String[] args) {
int[] arr = new int[]{8,5,9,3,6,4,10,2,7};
System.out.println(Arrays.toString(bullbleSort(arr)));
}
public static void swap(int[] nums, int m, int n) {
if(m == n) {
return;
}
int tmp = nums[m];
nums[m] = nums[n];
nums[n] = tmp;
}
public static int[] bullbleSort(int[] nums) {
if (nums.length == 0 ){
System.out.println("数组为空,无需排序");
}
if(nums.length == 1) {
System.out.println("数组仅有一个元素,无需排序");
}
for(int i = 0; i < nums.length; i++) {
for(int j = 0; j < nums.length; j++) {
if(nums[j] > nums[j + 1]) {
swap(nums, j, j+1);
}
}
}
return nums;
}
}
说明:
这样写执行会报错,因为循环进行比较的时候,j的值最大只能到倒数第二个值(7),上述代码中j的范围是(0~8),j+1会导致数据越界
除此之外,每一轮循环会确定一个该轮最大的值,放在数组的后部, 每轮找到该轮最大的值,后续该最大值就无需再参与比较,所以据此可以更近一步缩小j的范围,推导过程如下:
第一轮: i = 0; j最大为7(9-1-1)
第二轮: i = 1;j最大为6(9-1-2)
第三轮: i = 2;j最大为5(9-1-3)
...
第N轮: i = n-1; j最大为9-1-n即: num.length-1-n
所以最终的代码为:
import java.util.Arrays;
public class bubble_sort {
public static void main(String[] args) {
int[] arr = new int[]{8,5,9,3,6,4,10,2,7};
System.out.println(Arrays.toString(bullbleSort(arr)));
}
public static void swap(int[] nums, int m, int n) {
if(m == n) {
return;
}
int tmp = nums[m];
nums[m] = nums[n];
nums[n] = tmp;
}
public static int[] bullbleSort(int[] nums) {
if (nums.length == 0 ){
System.out.println("数组为空,无需排序");
}
if(nums.length == 1) {
System.out.println("数组仅有一个元素,无需排序");
}
for(int i = 0; i < nums.length; i++) {
for(int j = 0; j < nums.length-1 -i; j++) {
if(nums[j] > nums[j + 1]) {
swap(nums, j, j+1);
}
}
}
return nums;
}
}
运行结果: