您的位置:首页 > 编程语言 > Java开发

排序算法之冒泡算法

2015-09-13 23:54 561 查看
public class TestSort{
/**

* 冒泡算法1
* 实现大的数字往后冒
* @param a
* @return
*/
public  int[] bubbleSort_1(int a[]){
int temp;
for (int i=0;i<a.length;i++){
for(int j=1;j<a.length-i;j++){
if(a[j]<a[j-1]){
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
return a;
}
/**
* 冒泡算法2
* 实现小的数字往前冒
* @param a
* @return
*/
public  int[] bubbleSort_2(int a[]){
int temp;
for (int i=0;i<a.length;i++){
for(int j=a.length-1;j>i;j--){
if(a[j]<a[j-1]){
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
return a;
}

public static void main(String[] args) {
int a[]={3,6,24,12,17,45,43,25,1,7,9};
TestSort sort=new TestSort();
int b[]=sort.bubbleSort_2(a);
for(int i=0;i<b.length;i++){
System.out.println(b[i]);
}
}
}

冒泡算法的实现比较简单,其时间的复杂度为O(n^2).

教科书上写着冒泡算法在数列原本就是正序的时候性能最好,最好的时间为O(n).

这其实是给人造成误解的。

因为以上的冒泡算法的实现无论是在数列顺序怎样的情况下时间复杂度都为O(n^2),当数列为正序的情况下只是元素交换的三个步骤省去了,当然性能得到了提升,但是其比较的次数并没有得到减少,因此时间复杂度并没有变化。

而书上提到的O(n)的情况是经过以上的冒泡算法改进的。

其源代码如下:

public void bubbleSort(int arr[]) {
   boolean didSwap;
   for(int i = 0, len = arr.length; i < len - 1; i++) {
       didSwap = false;
       for(int j = 0; j < len - i - 1; j++) {
           if(arr[j + 1] < arr[j]) {
               swap(arr, j, j + 1);
               didSwap = true;
           }
       }
       if(didSwap == false)
           return;
   }    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息