数据结构与算法——冒泡排序

冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

方法一:(初级版本的冒泡排序算法)从第一位开始循环比较,让每一个关键字都和它后面的每一个关键字比较,如果大则交换。

 1 public class BubbleSort {
 2     public void bubbleSort(int[] arr) {
 3         if(arr==null || arr.length==1) {
 4             return;
 5         }
 6         int i,j;
 7         int len=arr.length;
 8         for(i=0;i<len;i++) {
 9             for(j=i+1;j<len;j++) {
10                 if(arr[i]>arr[j]) {
11                     swap(arr,i,j);
12                 }
13             }
14         }    
15     }
16     public void swap(int[] arr,int i,int j) {
17         int temp=arr[i];
18         arr[i]=arr[j];
19         arr[j]=temp;
20     }
21 }

方法二:(正宗的冒泡排序算法)

 1 public class BubbleSort {
 2     public void bubbleSort(int[] arr) {
 3         if(arr==null || arr.length==1) {
 4             return;
 5         }
 6         int i,j;
 7         int len=arr.length;
 8         for(i=0;i<len;i++) {
 9             for(j=len-1;j>i;j--) {//注意j是从后往前循环
10                 if(arr[j-1]>arr[j]) {
11                     swap(arr,j-1,j);
12                 }
13             }
14         }    
15     }
16     public void swap(int[] arr,int i,int j) {
17         int temp=arr[i];
18         arr[i]=arr[j];
19         arr[j]=temp;
20     }
21 }

方法三:(优化的冒泡排序算法)

 1 public class BubbleSort {
 2     public void bubbleSort(int[] arr) {
 3         if(arr==null || arr.length==1) {
 4             return;
 5         }
 6         int i,j;
 7         boolean flag=true;    //flag用来作为标记
 8         int len=arr.length;
 9         for(i=0;i<len && flag;i++) {   //若flag为false则退出循环
10             flag=false;                //初始为false
11             for(j=len-1;j>i;j--) {
12                 if(arr[j-1]>arr[j]) {
13                     swap(arr,j-1,j);
14                     flag=true;         //如果有数据交换,则flag为true
15                 }
16             }
17         }    
18     }
19     public void swap(int[] arr,int i,int j) {
20         int temp=arr[i];
21         arr[i]=arr[j];
22         arr[j]=temp;
23     }
24 }

冒泡排序复杂度分析

  • 算法最好的时间复杂度为O(n)
  • 算法最坏的时间复杂度为1+2+3+…+(n-1)=(n(n-1))/2次
  • 算法的平均时间复杂度为O(n2)
  • 算法的稳定性:冒泡排序算法是稳定的(相同元素的前后顺序并没有改变)

posted on 2018-03-31 22:14  Joyce&wang  阅读(183)  评论(0)    收藏  举报

导航