日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

为什么双层循环 冒泡排序_冒泡排序的双重循环理解

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么双层循环 冒泡排序_冒泡排序的双重循环理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主要說一下冒泡排序的一些關鍵地方的個人理解,比如算法思想,兩個循環的作用意義,中間循環變量范圍的確定等。

原理:比較兩個相鄰的元素,將值大的元素交換至右端。

思路:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。重復第一趟步驟,直至全部排序完成。

第一趟比較完成后,最后一個數一定是數組中最大的一個數,所以第二趟比較的時候最后一個數不參與比較;

第二趟比較完成后,倒數第二個數也一定是數組中第二大的數,所以第三趟比較的時候最后兩個數不參與比較;

依次類推,每一趟比較次數-1;

……

舉例說明:要排序數組:int[] arr={6,3,8,2,9,1};

第一趟排序:

第一次排序:6和3比較,6大于3,交換位置: 3 6 8 2 9 1

第二次排序:6和8比較,6小于8,不交換位置:3 6 8 2 9 1

第三次排序:8和2比較,8大于2,交換位置: 3 6 2 8 9 1

第四次排序:8和9比較,8小于9,不交換位置:3 6 2 8 9 1

第五次排序:9和1比較:9大于1,交換位置: 3 6 2 8 1 9

第一趟總共進行了5次比較, 排序結果: 3 6 2 8 1 9

第二趟排序:

第一次排序:3和6比較,3小于6,不交換位置:3 6 2 8 1 9

第二次排序:6和2比較,6大于2,交換位置: 3 2 6 8 1 9

第三次排序:6和8比較,6大于8,不交換位置:3 2 6 8 1 9

第四次排序:8和1比較,8大于1,交換位置: 3 2 6 1 8 9

第二趟總共進行了4次比較, 排序結果: 3 2 6 1 8 9

第三趟排序:

第一次排序:3和2比較,3大于2,交換位置: 2 3 6 1 8 9

第二次排序:3和6比較,3小于6,不交換位置:2 3 6 1 8 9

第三次排序:6和1比較,6大于1,交換位置: 2 3 1 6 8 9

第二趟總共進行了3次比較, 排序結果: 2 3 1 6 8 9

第四趟排序:

第一次排序:2和3比較,2小于3,不交換位置:2 3 1 6 8 9

第二次排序:3和1比較,3大于1,交換位置: 2 1 3 6 8 9

第二趟總共進行了2次比較, 排序結果: 2 1 3 6 8 9

第五趟排序:

第一次排序:2和1比較,2大于1,交換位置: 1 2 3 6 8 9

第二趟總共進行了1次比較, 排序結果: 1 2 3 6 8 9

最終結果:1 2 3 6 8 9

由此可見:N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數為(N-i)次,所以可以用雙重循環語句,外層控制循環多少趟,內層控制每一趟的循環次數,即

for(i=0;ifor(j=0;j外層循環的作用是: 提取出目前未排序數組中最大的數,放置于已排數據的左邊。也就是說我們第一次外層循環,是把最大數的位置交換到數組的最右邊,第二次外層循環是把次大數交換到數組的次右邊,依次類推。

內層循環的作用是: 實現我們想要的大數下沉的過程。每次比較的是相鄰兩個數據,所以一個數組的長度為n,我們只需要做 n-1 次相鄰的比較,就可以實現大數下沉,而 之前循環已經沉淀的大數并不需要再進行 排序了。

很清楚的看到N個數字要排序完成,總共進行N-1趟排序

為什么外層循環判斷條件是i

n 個數字總共需要 n-1 趟排序,外層循環 i 從0到 n-1 正好是 n-1 次。

為什么內層循環判斷條件是j

這要從冒泡排序原理說起:冒泡排序每循環排序一次,就把最大的一個數排在了最右邊(默認升序排),每一次排序都是在上一次排序的基礎上再排序,(比如)第2次排序之后,i已經成2了,第三次排序是要在第二次的基礎上在進行排序,而第二次排序后就已經把兩個最大的數已經放到最后了,所以第三次排序就不需要在去比他倆,就得把這個“2“減掉,只需要循環n-i次(此時的i是2);為什么-i之后還要-1呢? 這是因為在內層循環的判斷中是把當前值和后面一個值做比較的。如果不減1,則當循環到最后一個值的時候,再取下一個值就取不到,就需要額外的操作,或者拋出數組下標越界的異常。

其實內層的 j

1 就是標準解釋 上述的防止數組下標越界,比如n[] = {5, 22, 7, 42, 23},個數n=5,i現為2,n-i=3,i為2即進行第3趟,兩個數已經確定好,只需要比較前三個數了,而這只需要比較2次,即n-i(為2)-1=2。如果不減一,這里就是n-i(為2)= 3比三次,這顯然是錯的。就是正常是:

if n(0)>n(1)

if n(1)>(2) 這是正確的

不正確時,5-2=3 j從0到3 得比3次:

if n(0)>n(1)

if n(1)>(2)

if n(2)>(3) 這就比錯了 這都把 確定好的倒數第二大的數再給比較,這就是錯了。就成樂下表越界了。

2 每趟的比較中,都是n-1次,每趟中都是比總共這次要比的數的個數減一次,再加上要把i這已經確定的數的個數減去,即就是 j-i-1。實際上這也是n-i,n把來的i減去,剩下的待排序的數共有多少個,他們的個數再減去一就是他們這些剩下的數需要比較的次數了,這個跟網上說的數組是從下標0開始,沒啥關系,下標從0或1開始,影響的是內層循環的比較,是0,就直接引用,是1,就得n[i-1]。至于說的這個從0開始的說法,則它根本上也是想說防止下標越界。

至于算法優化什么的,暫時不考慮,這里只簡單說明了算法中幾個關鍵的點。

個人學習感悟,如有錯誤,還請指正。

附一些講冒泡比較好的說的文章:

https://blog.csdn.net/kelinfeng16/article/details/84034386

https://www.cnblogs.com/shen-hua/p/5422676.html

總結

以上是生活随笔為你收集整理的为什么双层循环 冒泡排序_冒泡排序的双重循环理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。