冒泡排序的圖解是:
總結一句話就是:連續比較相鄰的元素,降序則呼喚。有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;