精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

又被分治題卡住好幾個小時!用最笨的方法搞懂分治法邊界,告別死循環!

開發 前端
這篇文章寫于我剛學算法時。好家伙,第一道題快排就卡我老半天。但是好消息是,我算是沒有得過且過,花了一晚上和一上午,把所有情況都捋了一遍、把迭代過程考慮清楚了。

[[406991]]

這篇文章寫于我剛學算法時。好家伙,第一道題快排就卡我老半天。但是好消息是,我算是沒有得過且過,花了一晚上和一上午,把所有情況都捋了一遍、把迭代過程考慮清楚了。之后便感覺入了門,有了感覺,后續其他題目都沒有卡我這么久過。

被很簡單的快排 代碼運行狀態:Memory Limit Exceeded 老半天。

最后琢磨半天越界這事兒。總結起來一句話:避免出現 func(l, r) { ... func(l, r) ... } (遞歸時傳遞到下一層的邊界值不縮小)這種情況,因為這是死循環。 如何避免?比如func(l, r) { func(l, j), func(j + 1, r)}中,j至少滿足 j > r (j從r身上離開,防止 func(l, j) 是 func(l, r)),就可用。

  1. #include <iostream> 
  2. using namespace std; const int N = 1e6 + 10; int n; int q[N]; 
  3.  
  4. void quick_sort(int q[], int l, int r) 
  5.     if (l >= r) return
  6.  
  7.     int i = l - 1, j = r + 1, x = q[l + r >> 1]; 
  8.     while (i < j) 
  9.     { 
  10.         do i ++; while (q[i] < x); 
  11.         do j --; while (q[j] > x); 
  12.         if (i < j) swap(q[i], q[j]); 
  13.     } 
  14.     quick_sort(q, l, j), quick_sort(q, j + 1, r); 
  15.  
  16. int main() { scanf("%d", &n); for (int i = 0; i < n; i ++) scanf("%d", &q[i]); quick_sort(q, 0, n-1); for (int i = 0; i < n; i ++) printf("%d ", q[i]); return 0; } 

手賤,非得寫成:

  1. quick_sort(q, l, i - 1), quick_sort(q, i, r); 

好家伙,報錯。半天沒看出來,后來才恍然大悟,你要是用 i 分界,上面得是 x = q[l + r + 1 >> 1]; 。

那我下面這樣不行嗎?

  1. x = q[l+r >> 1]; 
  2. ... 
  3. quick_sort(q, l, j - 1), quick_sort(q, j, r); 
  4.  
  5. // 或者這樣不行嗎? 
  6. x = q[l+r >> 1]; 
  7. ... 
  8. quick_sort(q, l, i - 1), quick_sort(q, i, r); 
  9.  
  10. // 或者這樣不行嗎? 
  11. x = q[l+r >> 1]; 
  12. ... 
  13. quick_sort(q, l, i), quick_sort(q, i + 1, r); 
  14.  
  15. // 或者這樣不行嗎? 
  16. x = q[l+r+1 >> 1]; 
  17. ... 
  18. quick_sort(q, l, j), quick_sort(q, j + 1, r); 
  19.  
  20. // 或者這樣不行嗎? 
  21. x = q[l+r+1 >> 1]; 
  22. ... 
  23. quick_sort(q, l, j - 1), quick_sort(q, j, r); 
  24.  
  25. // 或者這樣不行嗎? 
  26. x = q[l+r+1 >> 1]; 
  27. ... 
  28. quick_sort(q, l, i), quick_sort(q, i + 1, r); 

上述都不行,看我一一舉反例。

我們輸入長度是2的數組,則第一層循環:l = 0, r = 1(即 quick_sort(0, 1)),如果進入第二層循環時,還出現 quick_sort(0, 1)的情況,則陷入死循環。

下表中,“傳到函數的i, j”指調用 quick_sort(q, l, ?i/j), quick_sort(q, ?i/j, r) 中 i, j 的值。

下表中,最后一列標記 x 表示將使程序陷入死循環。

對于 int mid = l+r >> 1;:

可見,在 int mid = l+r >> 1; 時,四種組合中只有 j j+1 經受住了 0 1 和 1 0 的雙重考驗。

對于 int mid = l+r+1 >> 1;:

可見,在 int mid = l+r+1 >> 1; 時,四種組合中只有 i-1 i 經受住了 0 1 和 1 0 的雙重考驗。

這是為什么呢?

  • 這里有相關證明:AcWing 785. 快速排序算法的證明與邊界分析[1]
  • 如果你沒耐心看上述較為嚴謹的證明,可以看文末我寫的

我用比較笨的方法理解是:

  • int mid = l+r >> 1;:則可證明 j 的取值范圍是 [l, r-1] ,因此對于邊界組合 j j+1 有 quick_sort(q, l, j小于r), quick_sort(q, j+1大于l, r) ,永遠都不會有 quick_sort(q, l, r) 出現。
  • int mid = l+r+1 >> 1;:則可證明 i 的取值范圍是 [l+1, r] ,因此對于邊界組合 i-1 i 有 quick_sort(q, l, i-1小于r), quick_sort(q, i大于l, r) ,永遠都不會有 quick_sort(q, l, r) 出現。

OK,那下面就是背誦:

  • 快排中,int mid = l+r >> 1;( mid 向下取整),是 j j+1,因為j 取值范圍是 [l r-1]
  • 我個人是不太喜歡背誦的,還是知道原理,覺得到時候可以快速推導出來靠譜,推導如下。

用較清晰但是笨拙的方法證明一下 mid 向下取整時 j 屬于 [l, r-1]。

向下取整時 j 屬于 [l, r-1] ==等價于== 向下取整時至少有兩次 j-- 被執行

下面分三種特殊情況討論(普通情況不討論),可以看出三種情況中都至少有兩次 j-- 被執行

情況1:j在r處就不再q[j] > x,而i在l處還滿足q[i] < x

  1. q[mid]     x 
  2.            9  8 
  3. begin   i        j 
  4. step1      i     j  do i++; while(q[i] < x); 
  5. step2      i  j     do j--; while(q[j] > x); 
  6. step3      8  9 
  7. step4      i  j     swap(q[i], q[j]); 
  8. step5         ij    do i++; while(q[i] < x); 
  9. step6      j  i     do j--; while(q[j] > x); 
  10. 跳出循環 while(i < j) {} 

j在r處就不再q[j] > x,而i在l處還滿足q[i] < x;因此對于l < r,還要再跳一輪,因為是 do while 而不是 while do ,所以不管 i 或 j 什么條件,都得再至少來一次 i++; j--; 。

情況2:j在r處還滿足q[j] > x,而i在l處就不再q[i] < x

  1. q[mid]     x 
  2.            8  9 
  3. begin   i        j 
  4. step1      i     j  do i++; while(q[i] < x); 
  5. step2      ij       do j--; while(q[j] > x); 
  6. step3      8  9 
  7. 跳出循環 while(i < j) {} 

j在r處還滿足q[j] > x,因此,一定會繼續執行j--,j一定會小于r。

情況3:j在r處就不再q[j] > x,且i在l處就不再q[i] < x

  1. q[mid]     x 
  2.            8  8 
  3. begin   i        j 
  4. step1      i     j  do i++; while(q[i] < x); 
  5. step2      i  j     do j--; while(q[j] > x); 
  6. step3      8  8 
  7. step4      i  j     swap(q[i], q[j]); 
  8. step5         ij    do i++; while(q[i] < x); 
  9. step6      j  i     do j--; while(q[j] > x); 
  10. 跳出循環 while(i < j) {} 

j在r處就不再q[j] > x,且i在l處就不再q[i] < x;此時有 i < j ,因此不跳出循環,執行 swap;對于l < r,還要再跳一輪,因為是 do while 而不是 while do ,所以不管 i 或 j 什么條件,都得再至少來一次 i++; j--; 。

這里的魅力在于 do while :不管咋的,你滿不滿足條件,我先給你移動一下,你再判斷。

對于二分法,核心思想也是避免出現func(l, r) { func(l, r); } ,因此出現 mid = l + r >> 1; 則必有 r = mid; ,因為 mid 是向下取整,l < r 時 mid 肯定碰不到 r 。

 

責任編輯:姜華 來源: Piper蛋窩
相關推薦

2019-03-05 09:32:31

SLA阿里云宕機

2022-11-18 14:15:13

2021-10-16 07:31:54

微信深度清理騰訊

2020-12-02 09:36:20

算法分支思想

2023-01-31 08:24:55

HashMap死循環

2013-06-06 13:34:56

HashMap線程不安全

2020-10-20 08:14:08

算法與數據結構

2020-11-13 09:31:44

分治算法運算

2023-05-30 14:54:17

Python循環語句工具

2011-08-29 16:23:29

Lua腳本

2018-10-10 20:20:14

2021-04-16 09:40:52

Java數據結構算法

2020-12-17 07:39:30

HashMap死循環數據

2021-12-20 10:39:30

TopK排序代碼

2021-05-12 09:07:09

Java數據結構算法

2025-01-21 00:00:00

HashMap死循環數據損壞

2011-09-07 10:13:04

IPv6IPv4

2024-12-06 16:00:00

C++頭文件

2023-10-08 09:42:41

GitHubDataTable?Fill

2010-09-09 16:40:58

SQL循環游標
點贊
收藏

51CTO技術棧公眾號

99热这里只有精品8| 国产精品极品美女在线观看| 丁香激情综合国产| 欧美一区二三区| 亚洲女同二女同志奶水| 亚洲ww精品| 午夜免费久久看| 视频一区亚洲| 亚洲女人18毛片水真多| 久久九九99| 久久国产加勒比精品无码| 国产精品无码一区二区三| 97久久网站| 午夜精品aaa| 宅男在线精品国产免费观看| 天堂av手机版| 国产在线精品国自产拍免费| 午夜精品久久久久久久久久久久 | 欧美性猛交xxxx黑人| 国产一区二区无遮挡| 国产又粗又猛又爽又| 亚洲国产一区二区三区在线播放| 欧美精品一区二区蜜臀亚洲| 亚洲成人av免费看| 日本精品600av| 久久久久久毛片| 亚洲在线第一页| 美日韩一二三区| 999精品色在线播放| 精品国产伦一区二区三区免费| 黄色a级片免费| 怡红院红怡院欧美aⅴ怡春院| 久久综合久久综合九色| 91手机在线观看| jizz国产在线| 亚洲尤物影院| 欧美激情18p| 色偷偷www8888| 国产一区二区三区天码| 日韩一区二区三区视频在线| 国产精品亚洲αv天堂无码| 国产色婷婷在线| 亚洲精品欧美激情| 亚洲日本理论电影| 免费在线视频你懂得| 丁香天五香天堂综合| 91精品啪aⅴ在线观看国产| 欧美一二三区视频| 亚洲调教视频在线观看| 欧美成人午夜激情视频| 天天操天天摸天天舔| 国产欧美久久一区二区三区| 日韩av在线免费看| 两女双腿交缠激烈磨豆腐| 日韩另类视频| 在线观看免费视频综合| 久久久免费视频网站| 51精品视频| 亚洲丰满少妇videoshd| 日本高清xxxx| 国产精品实拍| 成人欧美一区二区三区小说| 视频在线精品一区| 国产对白叫床清晰在线播放| 91网上在线视频| 美女被啪啪一区二区| 日韩中文字幕免费观看| 国产精品一区二区在线观看不卡 | 国产亚洲欧洲高清| 色婷婷av777| 国内精品久久久久久久久电影网| 日韩久久免费视频| 色噜噜日韩精品欧美一区二区| 久久亚洲黄色| 日韩av一区二区在线| 国产xxxx视频| 亚洲va久久| 亚洲天堂男人的天堂| 精品无码一区二区三区| 国产影视一区| 色噜噜亚洲精品中文字幕| 精品亚洲乱码一区二区| 亚洲精品在线观看91| 色综合色综合久久综合频道88| 青青草手机视频在线观看| 亚洲黄色视屏| 国产成人精品久久二区二区91 | 超碰人人人人人人人| 久久国产成人精品| 欧美成人在线免费视频| 久青草视频在线观看| 在线综合视频| 成人精品在线视频| 亚洲精品国产av| 91在线云播放| 色阁综合av| 超碰在线网址| 精品久久久久久| 无码内射中文字幕岛国片| 日韩国产大片| 欧美国产综合| 久久成人精品| 热99精品里视频精品| 欧美日韩国产精品综合| 欧美特黄一区| 91黑丝在线观看| 精品无码一区二区三区的天堂| 麻豆精品一二三| 97se亚洲综合| 青青久在线视频免费观看| 国产精品午夜电影| 裸体裸乳免费看| 超碰在线资源| 欧美视频在线一区| 日本中文字幕精品| 国产一区二区三区站长工具| 欧美成年人视频网站欧美| 日韩网红少妇无码视频香港| 亚洲国产日韩欧美一区二区三区| 91精品国产高清久久久久久久久| 久草手机在线视频| 精品一区二区三区香蕉蜜桃 | 日韩午夜影院| 国产精品久久久久久福利一牛影视| 在线观看成人av电影| 亚洲美女炮图| 欧美大片国产精品| 真实乱视频国产免费观看| 中文字幕一区二区精品区| 日本精品视频在线播放| 亚洲经典一区二区| **性色生活片久久毛片| 免费观看成人网| 国产精品欧美大片| 久久中文字幕在线| 波多野结衣高清视频| 成人av在线资源| 亚洲精品第一区二区三区| 色在线免费观看| 亚洲成人免费在线视频| 国产一区二区视频在线观看免费| 天使萌一区二区三区免费观看| 999在线观看免费大全电视剧| 黄色av网站在线| 婷婷成人激情在线网| 韩国三级与黑人| 99久久婷婷这里只有精品| 日本久久久久久久久| 天天干天天舔天天射| 亚洲一区影音先锋| 亚洲国产精品第一页| 综合天天久久| 亚洲999一在线观看www| 三区四区电影在线观看| 欧美三级一区二区| 娇妻被老王脔到高潮失禁视频| 国产精品普通话对白| 精品伦精品一区二区三区视频| 精品国产白色丝袜高跟鞋| 色偷偷成人一区二区三区91| av无码一区二区三区| 国产视频一区免费看| 国产日韩欧美一区二区三区四区| 欧美韩日亚洲| 亚洲精品一区二区三区香蕉 | a视频免费在线观看| 亚洲视频综合在线| 91视频福利网| 欧美国产高潮xxxx1819| 999国产在线| 青青草原av在线| 欧美不卡123| 黄色小视频在线免费看| 波波电影院一区二区三区| 久艹视频在线免费观看| 青青视频一区二区| 日本久久久久久久久久久| 国产在线资源| 欧美区一区二区三区| 美国一级片在线观看| 久久www免费人成看片高清| 一区二区三区四区五区视频| 欧洲亚洲精品| 欧美人在线视频| 蜜臀av免费在线观看| 欧美日韩亚洲精品内裤| 成人激情五月天| 韩国精品久久久| 日b视频免费观看| 三级精品视频| 国产精品自产拍高潮在线观看| 黄色网址免费在线观看| 精品国偷自产国产一区| 人妻丰满熟妇av无码区| 国产精品福利在线播放| 国产亚洲精品成人a| 日本va欧美va瓶| 8x8x华人在线| 天堂资源在线亚洲| 成人国产亚洲精品a区天堂华泰| 日韩av激情| 亚洲欧美激情四射在线日| 国产孕妇孕交大片孕| 亚洲欧美一区二区三区极速播放| 日本少妇一区二区三区| 日韩午夜精品| 亚洲欧美一二三| 亚洲裸色大胆大尺寸艺术写真| 国产精品福利无圣光在线一区| 岛国成人毛片| 亚洲精品一区二区三区婷婷月 | 欧美精品粉嫩高潮一区二区| 国产一级片播放| 国产免费久久精品| 国产白袜脚足j棉袜在线观看 | 激情网站五月天| 欧美色图麻豆| 熟女视频一区二区三区| 香蕉久久夜色精品国产更新时间| 成人免费福利在线| 666av成人影院在线观看| 九九热这里只有精品免费看| 国产午夜在线视频| 欧美本精品男人aⅴ天堂| 亚洲av综合一区| 午夜视黄欧洲亚洲| 潘金莲一级黄色片| 久久综合久久鬼色中文字| 激情成人在线观看| 美女在线一区二区| 国产精品无码专区av在线播放| 午夜精品久久99蜜桃的功能介绍| 日韩欧美一区二区视频在线播放| 国产suv精品一区二区四区视频| 国产精品专区一| 欧美专区福利免费| 97视频在线观看免费高清完整版在线观看 | 一二三区不卡| 日韩午夜视频在线观看| 亚洲黄页在线观看| 国产亚洲一区在线播放 | 91亚色免费| 先锋影音一区二区| 国产精品久久久久久久美男| 性欧美18xxxhd| 亚州成人av在线| 日本在线观看高清完整版| 欧美成在线视频| 午夜在线视频| 另类美女黄大片| 国产一二区在线| 久久精品99无色码中文字幕| 成人福利在线| 伊人亚洲福利一区二区三区| 国产一区二区三区福利| 亚洲欧洲在线播放| 欧美3p视频在线观看| 日韩高清不卡av| 亚洲欧美日韩动漫| 亚洲精品色婷婷福利天堂| 香蕉av在线播放| 亚洲美女黄色片| 免费在线高清av| 一区二区三区 在线观看视| 美国一级片在线免费观看视频 | 久久国产精品无码一级毛片| 成人18视频在线播放| 一级欧美一级日韩片| av色综合久久天堂av综合| 国产黑丝一区二区| 97久久超碰国产精品电影| 你懂的在线观看网站| av中文一区二区三区| 免费看黄色aaaaaa 片| 久久亚洲综合色一区二区三区| 实拍女处破www免费看| 欧美国产一区二区在线观看| 国产亚洲精品精品精品| 中文字幕制服丝袜成人av| 欧美自拍偷拍网| 亚洲精品水蜜桃| 国产一级视频在线| 欧美日韩免费在线| 国产精品成人久久久| 欧美精品在线观看播放| www.激情五月| 日韩电影第一页| 黄网站免费在线播放| 九九视频这里只有精品| 日韩精品影片| 91丨九色丨国产| 外国成人在线视频| 中文字幕中文字幕一区三区| 国产一区日韩一区| 欧美少妇性生活视频| 久久99精品国产.久久久久久| 亚洲一区二区三区四区av| 国产日韩v精品一区二区| 伊人在线视频观看| 福利精品视频在线| 一道本在线视频| 亚洲精品国产精品国自产观看浪潮 | 亚洲一级理论片| 亚洲国产一区二区三区 | 8888四色奇米在线观看| 欧美国产视频一区二区| 欧美free嫩15| 国产精品美女久久久久av福利| 欧美理伦片在线播放| 视频一区二区三| 欧美日韩国产欧| www.涩涩涩| youjizz久久| 成年人网站在线观看视频| 精品国产成人在线| 国产又粗又大又爽视频| 日韩精品高清视频| 91高清在线观看视频| 日本最新高清不卡中文字幕| 日本精品一区二区三区在线观看视频| 欧美精品成人一区二区在线观看 | www.日本在线视频| 日韩和欧美一区二区| 韩国三级视频在线观看| 国产欧美一区二区三区鸳鸯浴| 久久高清无码视频| 欧美日韩一级黄| 国产最新视频在线观看| 久久久久久久久久婷婷| av在线精品| 视频一区二区三| 久久只有精品| 日韩aaaaa| 亚洲自拍偷拍欧美| 国产麻豆免费视频| 亚洲网站视频福利| 国产盗摄一区二区| 亚洲xxxx3d| 天天做综合网| 欧美成人乱码一二三四区免费| 久久综合色8888| 欧美精品亚洲精品日韩精品| 日韩西西人体444www| 美女国产在线| 国产精品一区久久| 国产精品最新| 免费日韩视频在线观看| 国产黄色精品网站| 国精产品久拍自产在线网站| 日韩欧美国产免费播放| 香蕉av在线播放| 欧美一乱一性一交一视频| 久久亚洲黄色| 免费欧美一级视频| 97国产精品videossex| 国产精品日日夜夜| 日韩成人xxxx| 欧美gv在线| 欧美激情www| 日韩av中文字幕一区二区三区| 在线天堂www在线国语对白| 亚洲在线观看免费视频| 天天操天天插天天射| 97在线精品国自产拍中文| 国偷自产视频一区二区久| 五月丁香综合缴情六月小说| 欧美激情精品久久久久久| 亚洲精品第一| 中文字幕av久久| 国产精品一区二区x88av| 国产97免费视频| 日韩欧美视频一区| 污视频在线看网站| 国内精品视频免费| 免费看的黄色欧美网站| 爱爱免费小视频| 欧美日韩精品电影| 影音先锋在线视频| 中文字幕第一区二区| 国产福利影院在线观看| 国产精品久久久久影院老司| 国产乱码一区二区| 欧美日韩aaaa| 国产精品久久久久久久久久久久久久久 | 亚洲国产精品综合| 国产精品一区二区在线观看不卡 | 国产精品高潮呻吟视频| 色呦哟—国产精品| 精品人妻一区二区三区免费| 亚洲成a人片在线观看中文| 国产在线观看免费网站| 国产精品日日做人人爱| 欧美影视一区| 国产传媒第一页| 欧美日韩成人综合天天影院 | 日韩高清三区| 天堂一区在线观看| 亚洲国产成人av| 欧美黄色小说| 91丝袜美腿美女视频网站|