說在前面
除了時間、空間複雜度之外,排序算法還有另外兩個概念:
原地排序:是指空間複雜度爲O(1)的排序算法;
穩定排序(排序的穩定性):是指在待排序序列中存在相等值,經過排序後,相等值之間的原有順序不變,即是穩定排序;
冒泡排序
思路
- 包含兩個操作原子,比較和交換,可以理解一次冒泡就是一輪比較和交換;
- 一次冒泡至少移動一個元素到應該在的位置,每次冒泡結束,下次冒泡的元素個數減1;
- 冒泡只操作相鄰的兩個數據,每次冒泡不停地對相鄰的兩個元素進行比較,滿足大小要求就進行交換,重複n次完成n個數據的排序;
- **優化:**當某次冒泡過程中沒有發過數據交換,說明序列已經達到完全有序,不需要再繼續後續的冒泡操作,重複次數就小於n;
實現
public void bubbleSort(int[] a,int n){
if(n<=1){
return;
}
for(int i=0;i<n;i++){
//是否提前完成 默認爲true,當冒泡過程中出現交換則設爲false
boolean isFinished=true;
//冒泡
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
//符合大小關係,從小到大,交換
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
//有交換操作說明未完成排序
isFinished = false;
}
if(isFinished){
//某次冒泡過程中沒有交換操作,則提前退出不再執行後續冒泡
break;
}
}
}
熄燈
冒泡排序
- 是穩定排序
- 是原地排序
- 最好O(1),最壞O(n2),平均O(n2)