1. 在介紹荷蘭國旗問題前,我們先對如下問題進行介紹:
給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數
組的左邊,大於num的數放在陣列的右邊。
要求額外空間複雜度o(1),時間複雜度o(n)。
該問題實際是乙個劃分問題。
思路:初始 小於等於區 最後乙個元素位置為-1
對陣列進行遍歷,cur與num進行比較,
1)cur>num:
cur右移
2) cur<=num
cur與 小於等於區 最後乙個元素 的下乙個元素互換,並將小於等於區右擴一位,cur右移
直到遍歷完成。
public
static
void
partition
(int
arr,
int l,
int r,
int p)
else
}}
2. 荷蘭國旗問題
給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的
左邊,等於num的數放在陣列的中間,大於num的數放在陣列的
右邊。要求額外空間複雜度o(1),時間複雜度o(n)
思路:初始 小於區 最後乙個元素位置為-1,大於區第乙個元素位置為arr.length
對陣列進行遍歷,cur與num進行比較,
1)cur=num:
cur右移
2) curnum
cur與 大於區 第乙個元素 的上乙個元素互換,並將大於區左擴一位,cur不動(因為遍歷時從左往右遍歷,在2)中,確保了小於區 最後乙個元素 的下乙個元素 是大於等於cur的,此處 大於區 第乙個元素 的上乙個元素 還沒有用於比較,因此cur不動)
public
static
int[
]partition
(int
arr,
int l,
int r,
int p)
else
if(arr[l]
> p)
else
}//返回等於區的範圍
return
newint
;}
3. 快速排序
參考該文 快速排序**
4.快速排序的改進
隨機快排(基準數的選取隨機)
參考荷蘭國旗問題
public
static
void
quicksort
(int
arr)
quicksort
(arr,
0, arr.length -1)
;}public
static
void
quicksort
(int
arr,
int l,
int r)
}public
static
int[
]partition
(int
arr,
int l,
int r)
else
if(arr[l]
> arr[r]
)else
}swap
(arr, more, r)
;return
newint
;}
快速排序與荷蘭國旗及Partition問題
給定乙個陣列arr,和乙個整數num。請把小於等於num的數放在陣列的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 給定乙個陣列arr,和乙個整數num。請把小於num的數放在陣列的左邊,等於num的數放在中間,大於num的數放在陣列的右邊。要求額外空間複雜度o 1...
荷蘭國旗問題 快速排序
目錄 一.荷蘭國旗 二.快速排序 亂序快排優化版 三.應用傳統快排求中位數 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...