引言
氣泡排序是我們一般排序入門,也是演算法入門。但是重複的迴圈注定它是乙個低效的演算法,低效不低效是由排序多少數字來決定的。可能我們排幾個數時,看不出來,但是要是給上乙個100萬數字的陣列排序,那就需要很長的時間,而快排只需要很短時間。
原理它的一次排序就像石頭扔在水中,石頭和水不停的做交換,直到石頭觸地。
將相鄰的兩個元素加以比較,若左邊的元素大於右邊的元素,則將兩元素交換,若左邊的元素小於右邊的元素,那麼兩元素位置不變,右邊的元素繼續和下乙個元素進行比較,重複這個過程,直到比較到最後乙個數為止。
偽**
bubblee-
sort
(a)//氣泡排序
for i <
-1 to length[a]
//外層迴圈 從第乙個數到最後乙個數
dofor j <
- length[a] downto i+
1//只排 指標往後的
doif a[i]
//比較
then exchange a[j]
<
->a[j-1}
//交換
**private
static
int[
]bubblesort
(int
a)}}
return a;
}
時間複雜度分析
**段開銷
次數for i <- 1 to length[a]
c1n+1
do for j <- length[a] downto i+1c1∑i=
1n(n
−i+1
)\sum_^n(n-i+1)
i=1∑n
(n−i
+1)do if a[j]c2
∑ i=
1n(n
−i
)\sum_^n(n-i)
i=1∑n
(n−i
)then exchange a[j]<->a[j-1]
c3t(i)
t (n
)=c1
(n+1
)+c1
[∑i=
1n(n
−i+1
)]+c
2[∑i
=1n(
n−i)
]+c3
ti
t(n) = c_1(n+1) + c_1[\sum_^n(n-i+1)]+c_2[\sum_^n(n-i)] +c_3t_i
t(n)=c
1(n
+1)+
c1[
i=1∑
n(n
−i+1
)]+c
2[i
=1∑n
(n−
i)]+
c3t
i= c1
(n+1
)+c1
n(n+
1)/2
+c2n
(n−1
)/2+
c3ti
= c_1(n+1) +c_1n(n+1)/2+c_2n(n-1)/2+c_3t_i
=c1(n
+1)+
c1n
(n+1
)/2+
c2n
(n−1
)/2+
c3t
i= n2
(c1+
c2)/
2+n(
3c1−
c2)/
2+c1
+c3t
i= n^2(c_1+c_2)/2 + n(3c_1 - c_2)/2+c_1+c_3t_i
=n2(c1
+c2
)/2
+n(3
c1−
c2)
/2+c
1+c
3ti
最後的結果:
t (n
)=an
2+bn
+c
t(n) = an^2+bn+c
t(n)=a
n2+b
n+c在排序量特別大時,高數告訴我們要忽略低項看高項(在n
2n^2
n2看來n
nn就是個弟弟)
我們可得到乙個大概描述這個時間複雜度的值 o(n
2)
o(n^2)
o(n2)
如何優化演算法
氣泡排序很穩定,但是它時間複雜度高,重複交換的太多了,如:
我這裡只能改進演算法,讓它少算一些不必要的過程,但也不能**(要高效就只能用其他演算法了)
改進1:
以上面的排序,如果我們一開始就給出的是一排好的陣列,但是陣列還是要再排一遍,所以為了解決這個問題,就要在**中放置一監視的變數。
private
static
int[
]bubblesort
(int
a)}if
(maxt)
return a;
}return a;
java 氣泡排序
氣泡排序 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算法的...
Java氣泡排序
氣泡排序 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算法的...
java 氣泡排序
氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較...