陣列 顏色分類(兩路排序)

2021-08-18 00:10:08 字數 1035 閱讀 1273

乙個陣列中,分別以0,1,2代表紅、白、藍三種顏色,要求對陣列進行排序,使表示相同顏色的元素相鄰,且按照紅、白、藍的順序進行排序。

方法一:使用交換的方法,依次訪問時,把0放到左邊,把2放到右邊,1不動,交換完成之後,排序就完成了

public void sortcolors(int nums) 

else

}else if(nums[i] == 2)

else

}else i++; //元素是1,不動,i往後移動

}}

上面的方法還可以稍微簡化:

public void sortcolors(int nums) 

if (nums[index] == 2)

index++;

}}

方法二:遍歷一遍陣列,分別計算陣列中0、1和2的個數,然後直接把陣列的三部分設定成相應個數的0、1、2。這種方法需要遍歷兩次,但每次遍歷所做的操作較少。

void sortcolors(int a, int n) 

for(int i = 0; i < num0; ++i) a[i] = 0;

for(int i = 0; i < num1; ++i) a[num0+i] = 1;

for(int i = 0; i < num2; ++i) a[num0+num1+i] = 2;

}

方法三:記錄三種顏色的下標,遍歷的時候,如果遇到0,則三個下標都往後移動一位,並且把陣列中的所有遍歷過的元素都往後移動一位(相當於在0下標的位置增加了乙個0);如果遇到1,則1和2的下標往後移動一位,把值為1和2的元素都往後移動一位(相當於在1下標的位置增加了乙個1);如果遇到2,則把2的下標和值往後移動(相當於在2下標位置增加了乙個2)

void sortcolors(int a, int n) 

else if (a[i] == 1)

else if (a[i] == 2)

}}

演算法複習之兩路歸併排序

兩路歸併排序 最差時間複雜度 o nlogn 平均時間複雜度 o nlogn 最差空間複雜度 o n 穩定性 穩定 兩路歸併排序 merge sort 也就是我們常說的歸併排序,也叫合併排序。它是建立在歸併操作上的一種有效的排序演算法,歸併操作即將兩個已經排序的序列合併成乙個序列的操作。該演算法是採...

資料結構 排序 兩路歸併排序演算法

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完...

演算法日積月累 7 兩路快排

二 第 2 版快速排序 雙路快排 在有很多重複元素的情況下,放在中間的那個 j 的位置也會使得遞迴的過程變得很不平衡,這個時候我們也可以採取一定的優化措施。我們可以編寫乙個測試用例,構造出乙個有很多個重複鍵值的陣列,分別使用 歸併排序 和 快速排序 看看它們的耗時。from sort.sort he...