三色排序問題

2021-09-25 23:13:19 字數 1626 閱讀 6566

輸入乙個整型陣列,每個元素在0~2之間,其中0,1,2分別代表紅、白、藍。現要求對陣列進行排序,相同顏色的在一起,而且按紅白藍順序先後排列。要求時間複雜度為o(n)。

最容易想到的是排序,比如快排,歸併,堆排等,但它們的時間複雜度為o(nlogn),與題意不符。

第二種想到的是計數排序,掃瞄一遍過去,分別記錄0,1,2的個數,然後再對陣列進行賦值。時間複雜度為o(2n),即o(n),滿足條件。

還有一種方法,只需掃瞄一遍陣列即可,其充分利用了元素只有3種的特性:在掃瞄陣列的時候,使用首尾倆個指標,分別指示0、1與1、2邊界。比如源陣列為。

第一步:首指標p0,尾指標p1,i標識當前掃瞄位置,當前位置值為2,需要將其交換至尾指標p1位置,p1要向前移動一位,p0、i位置不變。

第二步:i位置值不為0、2,i要向後移動一位,p0、p1位置不變。

第三步:i位置值為2,需要將其交換至尾指標p1位置,並且p1往前移動一位,i與p0位置不變。

第四步:i位置不為0、2,i要向後移動一位,p0、p1位置不變。

第五步:i位置值為0,需要將其交換至首指標p0位置,並且p0往後移動一位,i與p1位置不變。

第六步:i位置不為0、2,i要向後移動一位,p0、p1位置不變。

第七步:i位置值為0,需要將其交換至首指標p0位置,並且p0往後移動一位,i與p1位置不變。

第八步:i位置不為0、2,i要向後移動一位,p0、p1位置不變。

第九步:i位置超過p1位置了,結束。

package com.derek.algorithm;

/** * 三色排序

* 輸入乙個整型陣列,每個元素在0~2之間,其中0,1,2分別代表紅、白、藍。

* 現要求對陣列進行排序,相同顏色的在一起,而且按紅白藍順序先後排列。要求時間複雜度為o(n)。

* @author

* @since 2023年8月7日

*/public class threecolorsort

if(narray[i] == 2)

} return narray;

}}

雙色 三色排序問題

實現乙個函式,給定乙個陣列,要求使得陣列中負數在所有正數的前面 實現乙個函式,給定乙個陣列,要求使得陣列中負數在前正數在後零在中間 1 include2 include34 輸出陣列元素 5void print int arr,int len 6 交換兩個數 7void swap int left,...

nowcoder 三色排序

有乙個只由0,1,2三種元素構成的整數陣列,請使用交換 原地排序而不是使用計數進行排序。給定乙個只含0,1,2的整數陣列a及它的大小,請返回排序後的陣列。保證陣列大小小於等於500。測試樣例 0,1,1,0,2,2 6 返回 0,0,1,1,2,2 定義乙個左指標,乙個右指標。當遍歷到0時,和左指標...

三色旗問題

三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...