数据结构与算法-冒泡排序
概述:
原理:https://visualgo.net/zh/sorting?slide=6 看图理解方便点
时间复杂度O(n^2)
空间复杂度O(1)
适用场景:大部分元素已有序
参考链接:
看了以后发现连冒泡都不会了
由于排序数组长度较小(手打的测试数组),难以用时间判断,这里使用count用于记录比较次数,判断是否优化。使用时请删除。
第一版
/**
* 基础版
*/
public static void sort1(int[] list) {
int count =0;
int temp;
int n = list.length;
for(int i=0;i<n;i++) {
for(int j=0;j<n-i-1;j++) {
if(list[j]>list[j+1]) {
temp = list[j+1];
list[j+1]=list[j];
list[j]=temp;
}
count++;
}
}
System.out.println(count);
}
第二版
如果当前这一轮比较时发现当前序列都已经有序(没有进行交换操作),则退出循环
/**
* 如果已经有序,提前退出
*/
public static void sort2(int[] list) {
int count =0;
int n = list.length;
for(int i=0;i<n;i++) {
boolean isSort = true;
for(int j=0;j<n-i-1;j++) {
if(list[j]>list[j+1]) {
int temp = list[j+1];
list[j+1]=list[j];
list[j]=temp;
isSort=false;
}
count++;
}
if(isSort) {
break;
}
}
System.out.println(count);
}
第三版
当前轮比较完成之后可能发现后续的序列有不少已经有序,根据把上一轮最后一次交换的位置判断已有有序区间长度,作为下一轮结束位置。
/**
* 修改有序区间长度
*/
public static void sort3(int[] list) {
int count =0;
int n = list.length;
int lastExChangeIndex = 0;
int sortBorder = n-1;
for(int i=0;i<n;i++) {
boolean isSort = true;
for(int j=0;j<sortBorder;j++) {
if(list[j]>list[j+1]) {
int temp = list[j+1];
list[j+1]=list[j];
list[j]=temp;
//当前序列不是有序的
isSort=false;
//最后一次更新位置
lastExChangeIndex=j;
}
count++;
}
sortBorder = lastExChangeIndex;
if(isSort) {
break;
}
}
System.out.println(count);
}
第四版
进行双向冒泡
/**
* 鸡尾酒排序,双向冒泡
*/
public static void sort4(int[] list) {
int count =0;
int n = list.length;
int lastRightExChangeIndex = 0;
int lastLeftExChangeIndex = 0;
int rightSortBorder = n-1;
int leftSortBorder = 0;
for(int i=0;i<n/2;i++) {
//正向冒泡
boolean isSort = true;
for(int j=leftSortBorder;j<rightSortBorder;j++) {
if(list[j]>list[j+1]) {
int temp = list[j+1];
list[j+1]=list[j];
list[j]=temp;
//当前序列不是有序的
isSort=false;
//最后一次更新位置
lastRightExChangeIndex=j;
}
count++;
}
rightSortBorder = lastRightExChangeIndex;
if(isSort) {
break;
}
//反向冒泡
isSort = true;
for(int j=rightSortBorder;j>leftSortBorder;j--) {
if(list[j-1]>list[j]) {
int temp = list[j];
list[j]=list[j-1];
list[j-1]=temp;
//当前序列不是有序的
isSort=false;
//最后一次更新位置
lastLeftExChangeIndex=j;
}
count++;
}
leftSortBorder = lastLeftExChangeIndex;
if(isSort) {
break;
}
}
System.out.println(count);
}