冒泡排序
若从小到大排序:
相邻的元素两两比较,较小的数后移(下沉),较大的数前移(冒泡),这样一趟比较下来,最大值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。
以下是图解:
代码实现
需要注意的是,在代码中又引入了Boolean类型的变量flag,这样如果提前完成排序即可退出程序。
import java.util.Arrays;
/**
* @Author 不知名网友鑫
* @Date 2022/3/20
**/
public class BubbleSort {
//从小到大排序。
public static void main(String[] args) {
int arr[]={10,5,2,4,1};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int arr[]){
//第一重循环控制排序的遍数,5个数只需要排4遍。
for(int i=0;i<arr.length-1;i++){
boolean flag=true;
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
flag=false;
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
//如果flag没有变化,代表这一遍没有进行排序,则排序完成。
if(flag==true){
break;
}
}
}
}
算法时间复杂度O(n^2)
因为是双重for循环,冒泡排序的时间复杂度是O(n^2)
。
以下代码会展示当n==100000
时程序的运行时间差别。
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Author 不知名网友鑫
* @Date 2022/3/20
**/
public class BubbleSort {
//从小到大排序。
public static void main(String[] args) {
int arr[]=new int [100000];
for(int i=0;i<arr.length;i++){
arr[i]=(int)(Math.random()*100000);
}
Date date=new Date();
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d1=simpleDateFormat.format(date);
System.out.println("排序前的时间是:"+d1);
bubbleSort(arr);
Date date2 = new Date();
String d2=simpleDateFormat.format(date2);
System.out.println("排序后的时间是:"+d2);
}
public static void bubbleSort(int arr[]){
//第一重循环控制排序的遍数,5个数只需要排4遍。
for(int i=0;i<arr.length-1;i++){
boolean flag=true;
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
flag=false;
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
//如果flag没有变化,代表这一遍没有进行排序,则排序完成。
if(flag==true){
break;
}
}
}
}
最后得到结论:冒泡排序适用于数据量很小的排序场景
如果觉得写的还不错的话,欢迎点一个⭐收藏⭐再走哦~~~