排序算法一冒泡排序
欢迎光临我的博客[http://poetize.cn],前端使用VUE2,聊天室使用VUE3,后台使用Spring Boot
原理
比较两个相邻的元素,将值大的元素交换至右端。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。
算法分析
冒泡排序算法的性能
排序类别 |
排序方法 |
时间复杂度 |
空间复杂度 |
稳定性 |
复杂性 |
||
平均情况 |
最坏情况 |
最好情况 |
|||||
交换排序 |
冒泡排序 |
O(N2) |
O(N2) |
O(N) |
O(1) |
稳定 |
简单 |
时间复杂度
1.如果我们的数据正序,只需要走一趟即可完成排序。
所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;
所以,冒泡排序最好的时间复杂度为-----O(n)。
2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。
每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。
在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为-----O(n2) 。
综上所述:冒泡排序总的平均时间复杂度为-----O(n2) 。
算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。
所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
1 public class BubbleSort { 2 public void sort(){
4 int[] arr = {12,123,3,1,0,6,4,6};
8 //优化代码,如果未交换则代表有序 9 boolean isChange= false; 10 11 if(arr==null || arr.length<2){ 12 return ; 13 } 14 for(int i =0;i<arr.length-1;i++){ 15 isChange=false; 16 for(int j=0;j<arr.length-1-i;j++){ 17 if(arr[j]>arr[j+1]){ 18 swap(arr,j,j+1); 19 isChange=true; 20 } 21 } 22 if(!isChange){ 23 break; 24 } 25 } 32 } 33 34 private void swap(int[] arr,int i, int j) { 35 arr[i]=arr[i] ^ arr[j]; 36 arr[j]=arr[i] ^ arr[j]; 37 arr[i]=arr[i] ^ arr[j]; 38 39 } 40 }