傳統的氣泡排序完全可以滿足我們最基本的需求,但是也僅僅是最簡單的需求,這種簡單的兩個for迴圈不加任何的判斷語句的形式注定它只能是一種效率最低的演算法。
我們先貼乙個傳統的實現方式,之後的三個優化全部建立在函式排序所使用的消耗上,這也是我們優化一切演算法的根本路徑。
[cpp]view plain
copy
?void bubblesort(int* arr,int size)
} }
}
void bubblesort(int* arr,int size)}}}
這種傳統的排序次數是固定的,即給出相同數目的幾個陣列 不論其元素排列是怎麼樣,時間複雜度都為o(n^2)。尤其當我們遇到下面這種序列
即: 1,2,3,5,4 我們只需要排一趟就可以了,基於這種情況我們給出了下面這種優化
[cpp]view plain
copy
?void bubblesort_optimize_1(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
} }
void bubblesort_optimize_1(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
}}
然而這種優化只能做到某一次已經排好序的時候我們直接跳跳出來,基於第一種優化我們得到一種啟發:當乙個陣列接近有序的時候我們往往只需要在某乙個小範圍內排序即可,我們可以用乙個標記來表示這個範圍的下限,例如遇到下面的情況
然而我們發現,每次排序前或排序後陣列的後面都有一部分已經有序,這時我們只要記下最後一次排下的陣列的下標下次排序的時候就可以只排序到此下標位置即可
第二個優化版本
[cpp]view plain
copy
?void bubblesort_optimize_2(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
index=max_index;//若排序過則將index置為最後一次交換的座標,若沒有則表示已經有序
} }
void bubblesort_optimize_2(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
index=max_index;//若排序過則將index置為最後一次交換的座標,若沒有則表示已經有序
}}
這裡的第三種優化是在前兩種優化的基礎上借用了類似於選擇排序的思想(有沒有發現選擇排序和氣泡排序的**有點相似),但是我們進行的是正反交替掃瞄,正著掃瞄得到最大值,反著掃瞄得到最小值(或者顛倒順序),這樣做的目的是為了當陣列本身已經接近有序或部分有序的時候多餘的判斷,這樣我們每次得到無序區的最大值和最小值只對它們排序就可以了。
[cpp]view plain
copy
?void bubblesort_optimize_3(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
index=max_index;//若排序過則將index置為最後一次交換的座標,若沒有則表示已經有序
for(int j=index;j>min_index;j--)
} min_index++;
if(flag)
break;//如果flag為1則說明排序前已經有序
} }
void bubblesort_optimize_3(int* a,int size)
} if(flag)
break;//如果flag為1則說明排序前已經有序
index=max_index;//若排序過則將index置為最後一次交換的座標,若沒有則表示已經有序
for(int j=index;j>min_index;j--)
{ //逆序掃瞄找到最小值
if(a[j]
三種氣泡排序
package com.wxh617.sort public class bubblesort public static void main string args 1.最簡單的氣泡排序演算法,沒有技術含量 本例中排序6趟 public static void bubblesort1 int a ...
(排序)氣泡排序的三種實現
主要內容 1 氣泡排序 2 氣泡排序實現1 3 氣泡排序實現2 4 氣泡排序實現3 氣泡排序是簡單的一種排序方法,效率低下,複雜度為o n 2 其具體的演算法流程如下 1 演算法需要對陣列遍歷n 1遍 2 在每一次遍歷中,比較前後相鄰元素的大小,如果第乙個比第二個大,則交換他們,這樣第一次遍歷之後陣...
氣泡排序的三種實現
氣泡排序是非常容易理解和實現,以從小到大排序舉例 設陣列長度為n。1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。2 這樣對陣列的第0個資料到n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第n 1個位置。3 n n 1,如果n不為0就重複前面二步,否則排序完成。按...