冒泡排序

来源:互联网 发布:android ndk linux 64 编辑:程序博客网 时间:2024/05/11 05:00

什么是冒泡排序?
比如对于一个无序的数组,想让它从小到大排列,则使用冒泡的排序规则如下:
1.将第一个元素和第二个元素进行对比,如果第一个元素大于第二个,则将二者进行交换,反之,则不用交换

2.当第一步比较完之后,对第二个元素和第三个以同样的规则进行比较,依次类推,最终的结果就是这一轮比较中最大的那个数被移动到了最后的位置,符合我们的预期目的

3.进行完第一轮比较,开始第二轮,依然是在第一个元素的位置开始比较,同样的规则,但是这一次只需要比较到倒数第二个元素,因为最后的那个已经被第一轮的最大数给占据着,无需再与它比较。

4.经过第二轮,倒数第二大的数也被拿出来了,并且移动到了数组倒数第二的位置,以此类推,再进行多轮直到结束,得到一个从小到大的数组。


以下是冒泡排序代码:

public void bubblesort(int a[]){int changeKey;   //作为正在进行交换的元素的下标int finishKey;   //作为排序结束的控制位for(finishKey=a.length-1; finishKey>1; finishKey--){    //排序的上限,每一轮之后都要减一for(changeKey=0; changeKey<finishKey; changeKey++){     //每轮排序中,元素从头到尾两两进行比较if(a[changeKey] > a[changeKey+1]){           //如果上一个元素大于下一个,则进行交换//交换int temp = a[changeKey];a[changeKey] = a[changeKey+1];a[changeKey+1] = temp;}}}}


排序测试:


控制台打印如下:

1 2 3 4 5 6 7 8 9


注:可以看到,finishKey初始化值是数组的最后一个下标,因为这个时候还没进行循环比较,所以第一轮应该是要比较到数组最后一个的位置的,接下来,当进行完第一轮之后,finishKey减一,所以第二轮根据changeKey<finishKey只比较到数组的倒数第二个元素的位置就够了。直到finishKey等于2的时候,这个时候是最后一轮比较,第一个元素和第二个元素进行比较,比较完之后就退出循环,得到最终结果。


冒泡排序的比较次数:
假如数组有N个元素,则第一轮需要比较N-1次,第二轮需要比较N-2次..依次类推,最终比较的次数为:
(N-1)+(N-2)+(N-3)+...1=N(N-1)/2次
所以算法作了约N^2次比较,由于在算法复杂度中常量要去掉,所以最终的时间复杂度为O(N^2)。

任何情况下,其实不止冒泡排序,只要有两层循环相互嵌套,则这个算法的时间复杂度一般为O(N^2)

0 0
原创粉丝点击