1.冒泡算法
抱歉。上個版本的文章確實有很大問題,大家的回復顛覆了我對冒泡排序的想法,在此謝謝大家。有個熱心觀眾寫的比我好些,他寫了三種很好的優化方法。傳送門
- 所謂冒泡算法(Bubble)就是每次找出最大(小)的值,將其放到最后,然后再對剩余的數進行重復操作。
第一個for循環:排除最后一個或幾個已經排序好的數。a.length-1是因為數組從0開始。
第二個for循環:找出剩余的數里的最大(小),放在最后。減去i,是為了排除已經排序好的元素。
代碼如下:
for(inti=0;i<a.length-1;i++){
for(intj=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
時間復雜度為O(n^2),太高了。
2.一層優化
- 但是還是不夠,因為有時候我們冒泡排序時,可能已經排好了,任然還在比較。這時候就需要一個flag進行判定。是否已經排好了,如果排好了就不進比較了。
int a[n];
int t;//交換容器
bool flag=true;//判定
for(inti=0;i<a.length-1;i++){
flag=false;
for(intj=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=true;
}
}
}
if(!flag){
break;
}
}
這樣子就會效率很多。
3.最后結論
冒泡算法簡單但并不好,主要是時間復雜度太高。
疑問:
int a[n];
int t;//交換容器
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
if (a[i] > a[j]) {
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
- 這種算法是什么排序呢?有沒有熱心觀眾解答一下。