【冒泡排序】

public void bubbleSort(int[] a){
	int nElems = a.length;
	
	int out,in;
	
	for(out=nElems-1;out>1;out--){
		for(in=0;ina[in+1]){
				int temp = a[in];
				a[in] = a[in+1];
				a[in+1] = temp;
			}
		}
	}
}

【冒泡排序】_第1张图片

冒泡排序是排序算法中较简单的一种算法,越大的元素越先“浮”起来,因此而得名。

代码中外层循环相当于一个计数器,第一次比较到nElems-1位置,因此out等于nElems-1,而后逐次递减,直到最后一次,比较到角标为1位置。内存循环从数组开始位置计起,没完成一次比较,in就会加上1,一直in等于out位置,结束这次循环。


冒泡排序的基本思路是:

1、比较数组的相邻的两个元素,如果左侧大于右侧元素,就将两个元素的位置交换,而后继续向下比较。

2、每一对相邻元素都会做同样的操作,这样就将最大的元素移动到了最右边。

3、最后一个元素确定最大后,无需再进行比较,下一轮比较,只比较到nElems-2的位置就可以了。

4、直到最后一个元素,无法比较了,他就是最小的元素,放在最左边,排序完成。


算法时间复杂度:

数组元素个数是N,第一轮中共比较了N-1次,接下来逐次递减1,那么比较的次数是:

(N-1)+(N-2)+(N-3)+...+1 = N*(N-1)/2 = O(N^2)

如果数组元素顺序恰好是由小到大,那么交换的次数最小为0,如果顺序是由大到小,那么便是交换的最多的次数,有代码中我们可以发现,每比较一次,内部循环如果有满足交换条件都会发生3次交换,因此,最坏的情况下交换次数为:

3*N*(N-1)/2 = O(N^2)

由此可以得出这样的结论,冒泡算法的平均时间复杂度为O(N^2)


算法稳定性:

在代码中我们可以看到,只有在相邻元素右侧大于左侧时,才会发生交换,当两个元素相等时,是不会发生交换的,因此算法是具有稳定性的。


算法不变性:

在这个算法中,我们可以看到,在外层循环out的右侧所有数据都是有序的,这个条件在算法运行过程中始终为真,这便是算法的不变性。



本文首次发表于依鹏csdn博客,转载请注明出处http://blog.csdn.net/m0_37240709/article/details/78038326


你可能感兴趣的:(algorithms)