快速排序及其改進(基於荷蘭國旗問題)

2021-10-03 13:56:32 字數 1801 閱讀 5385

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...