利用荷蘭國旗問題改進經典快排和隨機快排

2021-10-25 06:39:13 字數 2375 閱讀 8244

每次取陣列中最後乙個值,依照這個值把陣列分為兩份,小於的在左邊,大於的在右邊。再依次按照這樣的思想進行操作。

ps:荷蘭國旗問題可以看另一篇部落格

荷蘭國旗問題把陣列是分為三個部分的,小於、等於、大於這三個部分。按照這樣的思想,等於部分就不需要進行再次進行排序,這樣就能減少很大一部分的開銷。

/**

* 改進之後的經典快排和隨機快排。

* @author tyeerth

* @date 2020/10/26 - 20:00

*/public

class

quicksort

quicksort

(arr,

0, arr.length -1)

;}public

static

void

quicksort

(int

arr,

int l,

int r)

}//荷蘭國旗問題。以r位置上的數作為判斷。把陣列最後的乙個數作為劃分的中間值。

// l到r之間變有序

public

static

int[

]partition

(int

arr,

int l,

int r)

else

if(arr[l]

> arr[r]

)else

}//使得r位置上的數在中間。

swap

(arr, more, r)

;return

newint

;}public

static

void

swap

(int

arr,

int i,

int j)

// for test

public

static

void

comparator

(int

arr)

// for test

public

static

int[

]generaterandomarray

(int maxsize,

int maxvalue)

return arr;

}// for test

public

static

int[

]copyarray

(int

arr)

int[

] res =

newint

[arr.length]

;for

(int i =

0; i < arr.length; i++

)return res;

}// for test

public

static

boolean

isequal

(int

arr1,

int[

] arr2)

if(arr1 == null && arr2 == null)

if(arr1.length != arr2.length)

for(

int i =

0; i < arr1.length; i++)}

return

true;}

// for test

public

static

void

printarray

(int

arr)

for(

int i =

0; i < arr.length; i++

) system.out.

println()

;}// for test

public

static

void

main

(string[

] args)

} system.out.

println

(succeed ?

"nice!"

:"****ing ****ed!");

int[

] arr =

generaterandomarray

(maxsize, maxvalue)

;printarray

(arr)

;quicksort

(arr)

;printarray

(arr);}

}

快排2 經典快排和荷蘭國旗快排

基礎知識見 建議先閱讀基礎知識,並自己手推一遍 演算法原理 第一步 取陣列最後乙個數作為num,將陣列中的 num的數放在陣列的左邊,num的數放在陣列的右邊,這是可以理解為分成了兩個陣列 第二步 然後將 num的部分當成乙個陣列,繼續第一步 num的部分同理 第三步 若陣列的大小 2,則結束。流程...

由荷蘭國旗問題推導出的快排

快排引出的荷蘭國旗問題 void swap int a,int b 乙個問題的寫法有很多,怎麼想就怎麼寫,結果都是一樣的 void func int a,int l,int r else if a l a r else swap a r a more includeint main int c si...

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

1.在介紹荷蘭國旗問題前,我們先對如下問題進行介紹 給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 該問題實際是乙個劃分問題。思路 初始 小於等於區 最後乙個元素位置為 1 對陣列進行遍歷,cur與...