數據結構與算法-冒泡排序
概述:
原理: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);
}