每次取陣列中最後乙個值,依照這個值把陣列分為兩份,小於的在左邊,大於的在右邊。再依次按照這樣的思想進行操作。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與...