乙個陣列中,分別以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...