輸入乙個整型陣列,每個元素在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 不能用額外的記憶體,換句...