冒泡排序是最基本的排序算法之一。
算法利用一个二重循环对数列进行扫描。
外循环从0到a.length-1内循环从0到a.length-i-1,因为外循环每一趟结束之后,末端就会有一个大的元素到位,因此每一趟内循环搜索的范围在减少。
开始时整个数组为无序序列,有序序列不存在。在内循环内逐次比较相邻两个元素。
如果存在逆序就实行交换。整个算法中,元素数组的前端部分为无序数列,范围不断向前缩小,同时在后端不断构建由大到小的有序数列。
在每一趟后当前无序数列中最大的元素浮起到有序数列的最左端,是为冒泡的过程。
平均时间复杂度O(n^2).
最差时间复杂度O(n^2).
最优时间复杂度O(n).
具有原址性(in place), 需要额外辅助空间O(1).
java代码实现如下:
//O(n^2)
public class BubbleSort{
public static <AnyType extends Comparable<? super AnyType>>
void BubbleSort(AnyType[] a){
AnyType temp;
for(int i=0;i<a.length-1;i++)
for(int j=0;j<a.length-i-1;j++){
if(a[j].compareTo(a[j+1])>0){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
public static void main(String[] args){
System.out.println("Bubble Sort:");
Integer[] elements={3,4,1,8,10,2,0,6,5};
System.out.print("Original elements: ");
for(int i=0;i<elements.length;i++) System.out.print(elements[i]+" ");
System.out.println();
BubbleSort(elements);
System.out.print("After sorting: ");
for(int i=0;i<elements.length;i++) System.out.print(elements[i]+" ");
System.out.println();
}
}