荷蘭的國旗是由紅、白、藍三種,問題為時間複雜度為o(n)的情況下,按顏色依次排為紅、白、藍三種。
**的邏輯如下,並不複雜,所占用的空間複雜度為o(1)
int *test::sort(int *k, int counts)
} return k;
}
紅白藍三種情況,如果再考慮一次的話其實是對應的大於、小於和等於三種情況。可以用這種方法實現對快排的改版,挑選出比關鍵字大的和小的數,分別放在左邊和右邊。但是相比快速排序partition方法,不易找出初始值,(這裡的查詢方法邏輯比較雜,通過判斷兩個數是否是需要交換的數,是的話則重新對關鍵字賦值。其實比較邏輯可以放在swap方法中,這裡就不在贅述了。)
int *test::compare_sort(int *k,int low,int high)
else}}
if(j!=keys&&i!=keys) swap( k[i], k[j]);
i++; j++;
}if (values == 0)
if (values>0)
else}}
if(n!=keys&&j!=keys) swap( k[j], k[n]);
n--;
}}
實驗結果顯示該方法的效率和快排相差小。
荷蘭國旗問題 快速排序
目錄 一.荷蘭國旗 二.快速排序 亂序快排優化版 三.應用傳統快排求中位數 1.題目描述 給定乙個陣列arr和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度為o 1 時間複雜度為o n 2.分析思路 初始化less 1,...
荷蘭國旗問題,快速排序,隨機快速排序
荷蘭國旗問題 給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的 左邊,等於num的數放在陣列的中間,大於num的數放在陣列的 右邊。要求額外空間複雜度o 1 時間複雜度o n public static int partition int arr,int l,int r,int nu...
快速排序的應用 荷蘭國旗問題
題目描述 荷蘭國旗有三橫條塊構成,自上到下的三條塊顏色依次為紅 白 藍。現有若干由紅 白 藍三種顏色的條塊序列,要將它們重新排列使所有相同顏色的條塊在一起。本問題要求將所有紅色的條塊放最左邊 所有白色的條塊放中間 所有藍色的條塊放最右邊。題目中可以使用數字和顏色進行對應 red 0 white 1 ...