数据结构与算法——冒泡排序
冒泡排序(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) 收藏 举报
浙公网安备 33010602011771号