冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它的基本思想就是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
例如:初始序列3,6,4,2,11,10,5;从头开始,两两相比,若a[i]>a[i+1],则将两者交换;
从上面的排序过程来看,其实在第2趟结束后,数据序列就已经是有序的了,因此可以提前结束循环,从而避免3~6趟的不必要的比较。
Java实现:
package com.liuhao.sort; import java.util.Arrays; public class BubbleSort { public static void bubbleSort(DataWrap[] data) { System.out.println("开始排序"); int arrayLength = data.length; for (int i = 0; i < arrayLength - 1; i++) { boolean flag = false; //记录某趟是否发生元素交换 for (int j = 0; j < arrayLength - 1 - i; j++) { // 处的元素值大于j+1处的,j处data要往后沉 if(data[j].compareTo(data[j+1]) > 0){ DataWrap tmp = data[j]; data[j] = data[j+1]; data[j+1] = tmp; flag = true; } } System.out.println(Arrays.toString(data)); //如果某趟没有发生交换,说明序列已经有序,就不需要进行之后的比较了 if(!flag){ break; } } } public static void main(String[] args) { DataWrap[] data = { new DataWrap(21, "") ,new DataWrap(30, "") ,new DataWrap(49, "") ,new DataWrap(30, "*") ,new DataWrap(16, "") ,new DataWrap(9, "") }; System.out.println("排序之前:" + Arrays.toString(data)); bubbleSort(data); System.out.println("排序之后:" + Arrays.toString(data)); } }排序效果:
冒泡排序的时间效率是不确定的:最好的情况下,初始序列已经处在有序状态,执行一趟冒泡即可,做n-1次比较,无需进行任何交换;但在最坏的情况下,初始序列完全逆序,算法要执行n-1趟冒泡,第i趟做n-i次比较,执行n-i-1次对象交换,此时比较总次数为n*(n-1)/2,数据移动总次数为n*(n-1)*3/2。
冒泡排序算法的空间效率很高,只需一个附加程序单元用于交换,其空间效率为O(1)。
同时冒泡排序是稳定的
原文地址:http://blog.csdn.net/bruce_6/article/details/38728493