冒泡排序(Bubble Sort)
冒泡排序也叫起泡排序
冒泡排序的执行流程
1.从头开始比较每一对相邻元素,如果第一个比第二个大,就交换他们的位置。(执行完第一轮,最后的那个元素就是最大的元素)
2.忽略从步骤1中找到的那个最大元素,然后重复执行步骤1,直到元素有序
来看代码:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
}
}
}
return array;
}
调用一下试试
public static void main(String[] args) {
BubbleSort b = new BubbleSort();
int[] array = {9,8,7,4,5,6,1,2,3};
System.out.println("排序前");
for (int i = 0; i < array.length; i++) {
if(i!=0) System.out.print(" ");
System.out.print(array[i]);
}
b.bubbleSort(array);
System.out.println("\n排序后");
for (int i = 0; i < array.length; i++) {
if(i!=0) System.out.print(" ");
System.out.print(array[i]);
}
}
运行结果:
排序前
9 8 7 4 5 6 1 2 3
排序后
1 2 3 4 5 6 7 8 9
这是冒泡排序的最简单的形式,下面我们来给他优化一下。
优化冒泡排序1
优化方案: 如果序列已经完全有序,可以提前终止排序
来看代码:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
boolean b = true;
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
b = false;
}
if (b) break;
}
}
return array;
}
优化代码和未优化的代码的区别就是,优化代码添加了一个boolean类型,用来判断如果在for循环一圈后,都没有触动if语句,说明这个数组已经不需要排序了。然后直接结束排序。
当然这个排序还是可以有另外一种优化方式
优化冒泡排序2
优化方案: 如果序列已经局部有序,可以记录最后一次交换的位置,减少交换次数。
来看代码:
public int[] bubbleSort(int[] array ){
for (int end = array.length; end > 0; end--) {
int j = 1;
for (int begin = 1 ; begin<end ; begin++) {
if(array[begin]<array[begin-1]) {
int index = array[begin];
array[begin]=array[begin-1];
array[begin-1] = index;
j = begin;
}
end = j;
}
}
return array;
}
优化代码和未优化的代码的区别就是,优化代码添加了一个int类型,用来判记录最后交换的位置,然后直接可以让索引指向这个位置,下一次在进行循环可以直接从这个位置作为应该索引,这个位置后面的元素就可以不去遍历。
冒泡排序属于稳定排序,为原地算法
注:本文博主学习自腾讯课堂的小码哥的“数据结构与算法”,所以如有和小码哥课程中类似方案,纯属必然!!!