冒泡排序的 Java 实现 (Bubble Sort)
I. Bubble Sort 原理
冒泡排序: 相邻元素两两比较,如果前一个元素比后一个元素大,则交换。第一次完毕后,最大的元素就出现在最大索引处,同理继续以上步骤,最后可得排好序的数组。
II. Java 代码
package org.lovian.sort;
/**
* Bubble Sort
* @author PENG Zhengshuai
* @lovian.org
*/
public class BubbleSort {
public static void bubbleSort(int[] array){
boolean sorted = false;
int n = array.length - 1; //防止数组越界
while(!sorted){
//每一次扫描
sorted = true; //假定这次扫描能够完成排序
for(int i = 0; i < n; i++){
//每一次比较
if(array[i] > array[i+1]){
swap(array, i, i+1);
sorted = false; //经过一次交换,说明还需要一次扫描
}
}
n--; //每一次扫描最大值已经就绪,下一次扫描不需要再次比较已经排好位置的最大值
printArray(array);
}
}
public static void swap(int[] array, int src, int des){
int tmp = array[src];
array[src] = array[des];
array[des] = tmp;
}
public static void printArray(int[] array){
System.out.print("[");
for(int i = 0; i < array.length; i++){
if(i != array.length -1){
System.out.print(array[i] + " ,");
}else{
System.out.print(array[i] + "]");
}
}
System.out.println();
}
public static void main(String[] args) {
int[] array = { 76, 23, 49,28,48,10,3,97,65};
bubbleSort(array);
printArray(array);
}
}
result
[23 ,49 ,28 ,48 ,10 ,3 ,76 ,65 ,97]
[23 ,28 ,48 ,10 ,3 ,49 ,65 ,76 ,97]
[23 ,28 ,10 ,3 ,48 ,49 ,65 ,76 ,97]
[23 ,10 ,3 ,28 ,48 ,49 ,65 ,76 ,97]
[10 ,3 ,23 ,28 ,48 ,49 ,65 ,76 ,97]
[3 ,10 ,23 ,28 ,48 ,49 ,65 ,76 ,97]
[3 ,10 ,23 ,28 ,48 ,49 ,65 ,76 ,97]
[3 ,10 ,23 ,28 ,48 ,49 ,65 ,76 ,97]
III.和双层for循环冒泡排序的比较
除了上面用一个全局循环标志 sorted
来控制外层循环,一般来说,还有另一种很常见的双层 for 循环实现
public static void bubbleSort(int[] array){
for(int i = 0; i < array.length -1; i++){
//每一次扫描循环
for(int i = 0; i < array.length - 1 - i; i++){
//逐一比较
if(array[i] > array[i+1]){
swap(array, i, i+1);
}
}
}
}
这种双层 for 循环是必须把外循环全部执行一遍的,无论在中间的步骤数组排好序与否,都要执行 数组长度-1 次循环。而用 sorted
控制的循环是当数组排好序即退出循环。这两种方法在最坏的情况下,复杂度相同 (n square), 但是其他情况下,while 循环版本效率更高
Share this on