【交换排序】冒泡排序--Java

来源:互联网 发布:关键词优化要多久 编辑:程序博客网 时间:2024/05/22 17:02

冒泡排序是一种典型的交换排序方法,其思想是:

1、对相邻的关键字进行比较,使较小的关键字换至较大的关键字之前,进过一趟冒泡排序之后,关键字较小的记录到达最前面

2、对剩下的记录进行第1步,直到所有记录都有序为止


例如:设待排序的表有十个记录,其关键字分别为{3,4,6,7,9,8,1,5,2,0},其排序过程为:

第1次排序:{0,3,4,6,7,9,8,1,5,2}

第2次排序:{0,1,3,4,6,7,9,8,5,2}

第3次排序:{0,1,2,3,4,6,7,9,8,5}

第4次排序:{0,1,2,3,4,5,6,7,9,8}

第5次排序:{0,1,2,3,4,5,6,7,8,9}


代码1如下(运行成功):

public class BubbleSort {       public static void main(String[] args) {        int[] array={3,6,4,7,9,8,1,5,2,0};        for(int i=0;i<array.length-1;i++){        for(int j=array.length-1;j>i;j--){        if(array[j-1]>array[j]){        int tmp=array[j-1];        array[j-1]=array[j];        array[j]=tmp;        }        }        }        for(int i=0;i<array.length;i++){        System.out.print(array[i]+"\t");        }    }}

但是这种方法有缺陷,比如上述例题,其实经过五次冒泡就已经排序成功,但是根据代码而言,不会意识到排序已经成功,因此会继续执行代码直到执行n-1才会停止。可对代码进行优化,使得排序效率提到:可设置一个标志,当某一次冒泡排序发生元素交换,则为true,即排序未完成,继续进行冒泡排序;如果某一次没有发生元素交换,则为false,即排序已经完成。这样就能解决刚刚提到的问题。

代码2如下(运行成功):

public class BubbleSort {       public static void main(String[] args) {        int[] array={3,6,4,7,9,8,1,5,2,0};        boolean d=true;        int n=array.length;        while(d){        d=false;        for(int i=1;i<n;i++){        if(array[i-1]>array[i]){        int tmp=array[i-1];        array[i-1]=array[i];        array[i]=tmp;        d=true;        }        }        n--;        }        for(int k=0;k<array.length;k++){        System.out.print(array[k]+"\t");        }    }}


延伸:有两组数据:第一组数据乱序,第二组数据已排序,且第二组数据全部大于第一组数据,将两组数据放在一起后进行排序。

在这种情况下,如果进行前两种冒泡排序方法明显效率不高,因为后一组数据已经排好序。因此出现第三种排序方法,原理如下:

1、该组数据array[0]~array[k]未排序,array[k+1]~array[array.length-1]已排好序,且大于未排序的数据

2、第一次遍历后,最后发生交换的位置必定小于k,且这个位置之后的数据有序,记录下这个位置,之后的遍历就只用到这个位置,这样就可以避免不必要的比较了。

代码3如下(运行成功):

public class BubbleSort {       public static void main(String[] args) {        int[] array={3,2,4,1,0,5,6,7,8,9};        int d=array.length;        while(d>0){        int k=d;        d=0;        for(int i=1;i<k;i++){        if(array[i-1]>array[i]){        int tmp=array[i-1];        array[i-1]=array[i];        array[i]=tmp;        d=i;        }        }        }        for(int j=0;j<array.length;j++){        System.out.print(array[j]+"\t");        }    }}


冒泡排序的最坏时间复杂度为O(n^2),而平均的情况分析稍为复杂些,因为算法可能在中间的某一道排序后就终止了,所以可认为其平均时间复杂度为O(n^2).而辅助空间复杂度为O(1).




0 0