天天看點

算法之冒泡排序

冒泡排序的圖解是:

算法之冒泡排序

總結一句話就是:連續比較相鄰的元素,降序則呼喚。有n個數,共需要比較n-1趟,第i趟,需要比較n-i次。

public class bubblesort {//時間複雜度o(n^2)  

    public static void display(int[] array){  

        for(int i=0;i<array.length;i++){    

             system.out.print(array[i]+"\t");    

         }    

         system.out.println();   

    }  

    //冒泡排序  

    public static void bubblesort(int[] list){  

        int n=list.length;  

        for(int i=1;i<n;i++){//總共比較n-1趟  

            for(int j=0;j<n-i;j++){//第i趟比較n-i次  

                if(list[j]>list[j+1]){  

                    int temp;  

                    temp=list[j];  

                    list[j]=list[j+1];  

                    list[j+1]=temp;               

                }  

            }  

            system.out.print("第"+(i)+"輪排序結果:");    

            display(list);  

        }  

    public static void main(string args[]){  

        int[] list={25,6,56,24,9,12,55};     

        system.out.println("冒泡排序前的list是:");  

        for(int i=0;i<list.length;i++){  

            system.out.print(list[i]+" ");  

        system.out.println();  

        bubblesort(list);//進行冒泡排序  

        system.out.println("冒泡排序後的list是:");  

}  

算法之冒泡排序

算法分析:

最差的情況下,冒泡排序算法需要進行n-1次周遊。第一次周遊需要n-1次比較,第二次周遊需要n-2次比較,依次進行;是以比較總數為:

(n-1)+(n-2)+...+2+1=n(n-1)/2=o(n2)

冒泡排序的時間複雜度為o(n2)

冒泡算法的改進:

冒泡排序的效率比較低,是以我們要通過各種方法改進。在上例中,第四輪排序之後實際上整個數組已經是有序的了,最後兩輪的比較沒必要進行。

注意:如果某次周遊中沒有發生交換,那麼就不必進行下一次周遊,因為所有元素已經排好了。

bubbleimprovedsort.java

public class bubbleimprovedsort {  

            int n=list.length;  

            boolean neednextpass=true;  

            for(int i=1;i<n&&neednextpass;i++){//總共比較n-1趟,如果某趟周遊中沒有交換,那麼不需要下次周遊,因為元素以排好  

                neednextpass=false;  

                for(int j=0;j<n-i;j++){//第i趟比較n-i次  

                    if(list[j]>list[j+1]){  

                        int temp;  

                        temp=list[j];  

                        list[j]=list[j+1];  

                        list[j+1]=temp;       

                        neednextpass=true;  

                    }  

                system.out.print("第"+(i)+"輪排序結果:");    

                display(list);  

        public static void main(string args[]){  

            int[] list={25,6,56,24,9,12,55};   

            system.out.println("改進的冒泡排序:");  

            system.out.println("排序前的list是:");  

            for(int i=0;i<list.length;i++){  

                system.out.print(list[i]+" ");  

            system.out.println();  

            bubblesort(list);//進行冒泡排序  

            system.out.println("排序後的list是:");  

算法之冒泡排序

泛型冒泡排序:

例1:元素實作comparable接口。排序是字元串string,string實作了comparable接口

bubblegenerictypesort .java

<span style="font-size:24px;">public class bubblegenerictypesort {  

    //泛型冒泡排序,使用comparable對元素進行排序  

        public static <e extends comparable<e>> void bubblegenerictypesort(e[] list){  

            for(int i=1;i<n;i++){//總共比較n-1趟  

                    if(list[j].compareto(list[j+1])>0){  

                        e temp;  

                        list[j+1]=temp;               

    public static void main(string[] args) {  

        // todo auto-generated method stub  

        /*integer[] list={2,1,56,34,9,6,55,20,37,22}; //泛型的integer ,包裝類都實作了comparable接口 

        system.out.println("冒泡排序前的list是:"); 

        for(int i=0;i<list.length;i++){ 

            system.out.print(list[i]+" "); 

        } 

        bubblegenerictypesort(list);//進行冒泡排序 

        system.out.println(); 

        system.out.println("冒泡排序後的list是:"); 

        }*/  

        string[] list={"john","mike","jack","bob","zoo","meache","abrow","richer"}; //泛型的string ,包裝類都實作了comparable接口  

        bubblegenerictypesort(list);//進行冒泡排序  

</span>  

算法之冒泡排序

例2.元素實作自定義的comparator比較器接口

算法之冒泡排序

bubblecomparator.java

import java.util.arraylist;  

import java.util.comparator;  

import java.util.list;  

public class bubblecomparator {  

     public static <e>  void bubblecomparatorsort(list<e> list,comparator<? super e> comparator){//<? super e>是e的父類  

         int n=list.size();  

                if(comparator.compare(list.get(j), list.get(j+1))==1){  

                    e temp;  

                    temp=list.get(j);  

                    list.set(j, list.get(j+1));  

                    list.set(j+1, temp);                          

     }  

        // todo auto-generated method stub        

        list<geometricobject> list=new arraylist<geometricobject>();  

        list.add(new rectangle(4,5,"矩形4,5"));  

        list.add(new circle(3,"圓3"));  

        list.add(new square(3,"正方形3"));  

        list.add(new rectangle(2,6,"矩形2,6"));  

        list.add(new circle(4,"圓4"));  

        for(int i=0;i<list.size();i++){  

            system.out.print(list.get(i).getname()+":"+list.get(i).getarea()+"  ");  

        bubblecomparatorsort(list, new geometricobjectcomparator());//進行冒泡排序  

    public static class geometricobjectcomparator implements comparator<geometricobject> {  

        geometricobjectcomparator(){}  

        @override  

        public int compare(geometricobject o1, geometricobject o2) {  

            // todo auto-generated method stub  

            float area1=o1.getarea();  

            float area2=o2.getarea();  

            if(area1<area2){  

                return -1;  

            else if(area1==area2)  

                return 0;  

            else   

                return 1;  

算法之冒泡排序