经典排序算法--冒泡排序

排序面试题是各大IT面试必考的题目,问到排序问题就会延伸出算法问题。我们先来分析下冒泡排序的程序及算法。

程序代码如下:

public class Test {
	public static void bubbleSort(int[] source){
		for(int i=source.length-1;i>0;i--){
			for(int j=0;j<i;j++){
				if(source[j]>source[j+1]){
					swap(source,j,j+1);
				}
			}
		}
	}
	private static void swap(int[] source, int x, int y) {
		int temp=source[x];
		source[x]=source[y];
		source[y]=temp;
	}
	public static void main(String[] args) {
		int[] a={4,2,9,6,3,7,0,5,8,1};
		int i;
		bubbleSort(a);
		for(i=0;i<10;i++){
			System.out.print(a[i] );
		}
	}
}

冒泡排序是非常容易理解和实现的,以从小到大排序举例:

假设数组长度为N。

1、比较相邻的前后两个数据,如果前面数据大于后面数据,就将第二个数据跟第一个交换。

2、这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就”沉”到数组第N-1个位置。

3、N=N-1,如果N不为0就重复前面第二步,否则排序完成。

冒泡排序动画演示:

《经典排序算法--冒泡排序》

算法分析

(1)算法的最好时间复杂度。

若文件的初始状态是正序的,一次扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:

Cmin=n-1

Mmin=0

冒泡排序最好的时间复杂度为O(n)。

(2)算法的最坏时间复杂度。

若初始文件是反序的,需要进行n-1次排序。每次排序要进行n-i次关键字的比较(1<= i <=n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

Cmax=n(n-1)/2=O(n2)

Mmax=3n(n-1)/2=O(n2)

冒泡排序的最坏时间复杂度为O(n2)。

(3)算法的平均时间复杂度为O(n2)。

虽然冒泡排序不一定要进行n-1次,但是由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

(4)算法稳定性。

冒泡排序是就地排序,且它是稳定的。

点赞