冒泡排序的基本实现以及优化
**思想:**冒泡排序算法其实就是相邻元素间两两进行大小比较,交换其相对位置(如果元素相等不交换,因为冒泡排序的稳定性),每一轮比较结束后至少有一个元素到达它的最终位置。
下面我们来根据思想写一下代码:
public class Test{
public static void main(String[] args) {
//初始化数组
int[] data =new int[]{4,5,6,1,3,2};
//调用冒泡排序算法
bubbleSort(data);
print(data);
}
private static void bubbleSort(int[] array){
//n为数组长度
int n=array.length;
if(n==1){
return ;
}
//控制循环次数
for (int i=1;i<n;i++){
//相邻元素两两交换且每次循环至少有一个到达最终位置
for (int j=0;j<n-i;j++){
if (array[j]>array[j+1]){
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
}
private static void print(int[] array){
//遍历输出
for (int i:array){
System.out.print(i+"\t");
}
}
}
输出结果:
上面算法不严谨,没有考虑数组有序情况,如果数组有序那也需要进入if语句进行比较,这样就浪费资源而且耗时,是想一下给它设置个标志位,如果元素进行交换将标志位改为true,没有就false
下面我们来写一下优化后的代码:
public class Test{
public static void main(String[] args) {
//初始化数组
int[] data =new int[]{4,5,6,1,3,2};
//调用冒泡排序算法
bubbleSort(data);
print(data);
}
private static void bubbleSort(int[] array){
//n为数组长度
int n=array.length;
//设置标志位,初始化状态为true
boolean flag=true;
if (n==1){
return;
}
//控制循环次数
for (int i=1;i<n;i++){
flag=false;
//相邻元素两两交换且每次循环至少有一个到达最终位置
for (int j=0;j<n-i;j++){
if (array[j]>array[j+1]){
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
//满足if条件进行比较将状态改为true
flag=true;
}
}
if (!flag){
break;
}
}
}
private static void print(int[] array){
//遍历输出
for (int i:array){
System.out.print(i+"\t");
}
}
}
冒泡排序时间复杂度:O(n^2)
空间复杂度:O(1) 是一个原地排序,没有开辟新的空间
稳定性排序算法:只是相邻元素之间进行大小比较,发生大小关系时才会交换其相对位置