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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你知道荷兰旗问题吗?

發布時間:2025/3/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你知道荷兰旗问题吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?荷蘭旗問題又稱三色排序,或者彩虹排序,

因為荷蘭旗就三種顏色嘛,那這道題的問題就是給你三種顏色,按照給定的順序排好。

當然了,題目的問法各種各樣,有的給數字,有的給字母,但本質都是一樣的。

比如給你一個只含有三個數字的數組:312312312231111122113,
要求按照 1 2 3 的順序排好,即:111111111222222222223333333333
(請不要真的去數數,認真你就輸了)

還是用我們經典的「擋板法」。

在快排中,我們用了兩個擋板把數組分成三個區域:

<= pivot;未排序區間;> pivot

那么這里就要三個擋板,分成四個區域:

1, 2, 3, 未排序區間

Partition

具體說來,用 i, j, k 這三個指針分一下:
[0, i): 存 1
[i, j): 存 2
[j, k]: 未排序區間
(k, array.length-1]: 存 3

這里 j 放在未排序區間的左邊和右邊都行,但基本上大家都是放左邊,所以我們也沒必要“標新立異”。

初始化:

i = 0;
j = 0;
k = array.length - 1;
這樣才能保證 1,2,3 的每個區間都為空。

我們通過觀察指針 j 指向的元素來不斷縮小未排序區間,直到為空。

例子:1232312

為了好看,排好序的元素我們用 RGB 三原色標示一下。

Step1.

指針 j 指向 1,而 1 應該放在 [0, i) 區間內, 這里應該把指針 i 和指針 j 所指的元素交換一下,并且倆指針往前走。

雖然在這步看來是否交換沒什么區別,但是如果 i 和 j 之間有元素,就有區別了,比如 Step7.

Step2.

指針 j 指向 2,而 2 應該放在 [i, j) 區間內,所以 j++.

Step3.

指針 j 指向 3,而 3 應該放在
(k, array.length-1] 區間內,所以這里
j 和 k 指向的元素交換一下,并且 k--.

注意這里就不能 j-- 了,因為新換回來的元素還沒瞧呢,不知道它是幾。

Step4.

指針 j 指向 2,同 Step2,直接移動指針 j 即可。

Step5.

繼續移動指針 j。

Step6.

同 Step3.

Step7.

這一步就很明顯看出來了,
由于 1 應該放在 [0,i) 區間,所以這里把指針 i,j 所指向的元素交換一下,并且 i++, j++.

這樣未排序區間為空,我們就排好了~

時間復雜度

這個算法的 bottle neck 就在這個 while loop 里了,每次循環是 O(1),總共是 O(n).

空間復雜度

O(1)

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的你知道荷兰旗问题吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

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