對氣泡排序的理解和例項

2022-05-01 19:27:11 字數 3009 閱讀 4446

氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序演算法的運作如下:

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

有乙個陣列 :

int array = ;

現在要求從小到大進行排序,那麼我們可以想象排序過後 應該是

那麼 氣泡排序 的原理就是 :

每比較一輪,就把最大的放到最後面,這也是冒泡名稱的由來。

那麼我們先做第一輪比較吧!

for (int i = 0; i < a.length - 1; i++)   

}

來細分一下 這個比較的過程 :

i = 0 ,a[0] 和 a[1]比較,完成後陣列的順序應該是 :

4,5,3,2,1

i = 1 ,a[1] 和 a[2]比較,比較完以後,陣列的順序應該是 :

4,3,5,2,1

i = 2, a[2] 和 a[3]比較,比較完以後,陣列的順序應該是:

4,3,2,5,1

i = 3, a[3] 和 a[4]比較,比較完以後,陣列的順序應該是:

4,3,2,1,5

當i=4的時候,由於要判斷 i所以第一輪比較完以後,陣列的順序應該是 .

此時對比結果,還需要比較,那麼到底需要比較幾輪呢?幾輪呢?輪呢?呢~~~~??

如果 「每次把最大的數字冒到最後去」 算一輪的話,那麼在最極端情況下[比如本例],那麼應該是n-1輪,那麼又有同學問了,為什麼是n-1輪呢?

那再舉個例子,2個數字 比較的話,把大的放後面去要幾輪呢?1輪,也就是 2 - 1 輪,呵呵,推廣一下就是 n - 1輪了。

所以 冒泡的**應該是這個樣子的 :

1 for(int j = 0 ; j < a.length - 1; j++)   

8 }

9 }

到這裡冒泡其實已經結束了。

但是其實還有乙個優化空間。。。

我們前面已經發現,

經過第一輪排序,最大的乙個已經到最後乙個位置了。。

經過第二輪排序,次大的乙個已經到倒數第二個位置了。。

以此類推,所以每經過一輪排序,那麼「對應的倒數字置」的數字其實已經不用對比了。。。

比如 經過第一輪排序,那麼在進行第二輪排序的時候,倒數第乙個其實已經不用對比了,因為再第一輪排序的時候,已經非常明確,最後乙個就是最大的了。。

所以這裡就有乙個優化的地方 :

for(int j = 0 ; j < a.length - 1; j++)   } }

氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序演算法的運作如下:

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

有乙個陣列 :

int array = ;

現在要求從小到大進行排序,那麼我們可以想象排序過後 應該是

那麼 氣泡排序 的原理就是 :

每比較一輪,就把最大的放到最後面,這也是冒泡名稱的由來。

那麼我們先做第一輪比較吧!

for (int i = 0; i < a.length - 1; i++)   

}

來細分一下 這個比較的過程 :

i = 0 ,a[0] 和 a[1]比較,完成後陣列的順序應該是 :

4,5,3,2,1

i = 1 ,a[1] 和 a[2]比較,比較完以後,陣列的順序應該是 :

4,3,5,2,1

i = 2, a[2] 和 a[3]比較,比較完以後,陣列的順序應該是:

4,3,2,5,1

i = 3, a[3] 和 a[4]比較,比較完以後,陣列的順序應該是:

4,3,2,1,5

當i=4的時候,由於要判斷 i所以第一輪比較完以後,陣列的順序應該是 .

此時對比結果,還需要比較,那麼到底需要比較幾輪呢?幾輪呢?輪呢?呢~~~~??

如果 「每次把最大的數字冒到最後去」 算一輪的話,那麼在最極端情況下[比如本例],那麼應該是n-1輪,那麼又有同學問了,為什麼是n-1輪呢?

那再舉個例子,2個數字 比較的話,把大的放後面去要幾輪呢?1輪,也就是 2 - 1 輪,呵呵,推廣一下就是 n - 1輪了。

所以 冒泡的**應該是這個樣子的 :

1 for(int j = 0 ; j < a.length - 1; j++)   

8 }

9 }

到這裡冒泡其實已經結束了。

但是其實還有乙個優化空間。。。

我們前面已經發現,

經過第一輪排序,最大的乙個已經到最後乙個位置了。。

經過第二輪排序,次大的乙個已經到倒數第二個位置了。。

以此類推,所以每經過一輪排序,那麼「對應的倒數字置」的數字其實已經不用對比了。。。

比如 經過第一輪排序,那麼在進行第二輪排序的時候,倒數第乙個其實已經不用對比了,因為再第一輪排序的時候,已經非常明確,最後乙個就是最大的了。。

所以這裡就有乙個優化的地方 :

for(int j = 0 ; j < a.length - 1; j++)   } }

自我對氣泡排序以及對快速排序的理解

首先呢,我們閒話少說,直接入主題吧 冒泡 其實冒泡就是一組資料,讓它們左右兩位進行排序,若陣列的要求是要從大到小排序,那麼就讓小的數與大的數交換位置,交換位置就是根據for裡面的key值進行交換,但是還有一點就是不得不提的就是,我們需要給這個排序乙個標誌,在排序的開始,我們讓這個標誌位false,最...

對qsort函式的使用理解和氣泡排序的實現

首先是對qsort函式的使用方法的理解和總結 使用qsort函式排序各種型別的資料 qsort是一種編譯器自帶的排序函式 qsort需要四個引數 1.待排序陣列的位址 const void x 2.陣列大小 size t xx 3.陣列中每個元素的大小 size t 4。乙個確定排列順序的函式的指標...

氣泡排序的理解

int temp 作為交換媒介 for int i 0 i a.length i 外層迴圈 啟動內層迴圈,並改變內層迴圈次數限制。內層迴圈 比較 交換相鄰的兩個數,比較次數是陣列裡的資料個數減1。理解 假設陣列a裡有5個數。第一層迴圈會迴圈5次,也就是啟動5次第二層迴圈,同時每次都將改變第二層迴圈限...