您的位置:首页 > 其它

排序算法总结之冒泡排序

2014-08-21 13:24 253 查看
冒泡排序(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)。

同时冒泡排序是稳定的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: