荷蘭國旗問題 快速排序

2021-10-03 23:44:32 字數 1707 閱讀 3761

目錄

一.荷蘭國旗

二.快速排序(亂序快排優化版)

三.應用傳統快排求中位數

1.題目描述

給定乙個陣列arr和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。

要求額外空間複雜度為o(1),時間複雜度為o(n)。

2.分析思路

初始化less=-1,more=len(arr),當前位置為cur=0。

設該過程為partition。設陣列為(arr,l,r),0~less為小於num區域,more右為大於等於num區域。

迴圈結束的條件,cur碰上num。如圖1。

(1)curswap(arr, ++less, l++);

(2)cur=num,cur直接跳下乙個。

cur++;

(3)cur>num,和大於區域前乙個數交換,大於區域向左擴乙個位置。cur停在原地(當前數不變)。

3.實現**

vectorpartition(vector&arr,int l ,int r,int,num) 

else

} vectorp(2);

p[0] = less + 1; //less+1等於區域第乙個數

p[1] = more-1; //more-1等於區域最後乙個數

return p; //返回等於區域下標

}

1.演算法思想採用分治的思想2.時間複雜度o(n*logn),額外空間復度o(logn),演算法不穩定3.實現**

void quicksort(vectorarr) 

quicksort(arr, 0, arr.size()- 1);

}void quicksort(vectorarr, int l, int r)

vectorpartition(vector&arr,int l ,int r)

else if (arr1[l] > arr[r])

else

} swap(arr[more],arr[r]); //使最右邊的數放到等於區域

vectorp(2);

p[0] = less + 1; //less+1等於區域第乙個數

p[1] = more-1; //more-1等於區域最後乙個數

return p; //返回等於區域下標

}

補充:

荷蘭國旗問題,快速排序,隨機快速排序

荷蘭國旗問題 給定乙個陣列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 ...

荷蘭國旗問題(快速排序初步思想)

給定乙個整數陣列,給定乙個值k,這個值在原陣列中一定存在,要求把陣列中小於k的元素放到陣列的左邊,大於k的元素放到陣列的右邊,等於k的元素放到陣列的中間,最終返回乙個整數陣列。例如 給定陣列 2,3,1,4,7,6,5,10,9 給定乙個值9,那麼經過處理後結果陣列是 2,3,1 4,7,6,5,9...