Skip to content

Commit 9a21c2b

Browse files
author
tianqing.liang
committed
快速排序优化,二路快排,三路快排
1 parent 0d44e2d commit 9a21c2b

File tree

5 files changed

+163
-1
lines changed

5 files changed

+163
-1
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import 'dart:math';
2+
3+
class ArrayGenerator{
4+
5+
static List generateOrderedArray(int n){
6+
List arr = List.filled(n, true);
7+
for(int i = 0;i<n;i++){
8+
arr[i] =i;
9+
}
10+
return arr;
11+
}
12+
13+
static List generateRandomArray(int n,int bound){
14+
List arr = List.filled(n, true);
15+
Random random = new Random();
16+
for(int i = 0; i < n; i ++){
17+
arr[i] = random.nextInt(bound);
18+
}
19+
return arr;
20+
}
21+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import 'ArrayGenerator.dart';
2+
import 'dart:math';
3+
4+
/**
5+
* 二路快排
6+
*/
7+
class QuickSort2way {
8+
_QuickSort2way() {}
9+
10+
static sort2ways(List arr) {
11+
Random rnd = new Random();
12+
_sort2waysDetail(arr, 0, arr.length - 1, rnd);
13+
}
14+
15+
static _sort2waysDetail(List arr, int l, int r, Random rnd) {
16+
if (l >= r) return;
17+
18+
int p = _partition2ways(arr, l, r, rnd);
19+
_sort2waysDetail(arr, l, p - 1, rnd);
20+
_sort2waysDetail(arr, p + 1, r, rnd);
21+
}
22+
23+
static int _partition2ways(List arr, int l, int r, Random rnd) {
24+
int p = l + rnd.nextInt(r - l + 1);
25+
_swap(arr, l, p);
26+
// arr[l+1...i-1] <= v; arr[j+1...r] >= v
27+
int i = l + 1, j = r;
28+
while (true) {
29+
while (i <= j && arr[i].compareTo(arr[l]) < 0){
30+
i++;
31+
}
32+
while (j >= i && arr[j].compareTo(arr[l]) > 0){
33+
j--;
34+
}
35+
if (i >= j){
36+
break;
37+
}
38+
_swap(arr, i, j);
39+
i++;
40+
j--;
41+
}
42+
_swap(arr, l, j);
43+
return j;
44+
}
45+
46+
static _swap(List arr, int i, int j) {
47+
var t = arr[i];
48+
arr[i] = arr[j];
49+
arr[j] = t;
50+
}
51+
}
52+
53+
void main() {
54+
int n = 100;
55+
List arr2 = ArrayGenerator.generateRandomArray(n, n);
56+
print(arr2);
57+
QuickSort2way.sort2ways(arr2);
58+
print(arr2);
59+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import 'ArrayGenerator.dart';
2+
import 'dart:math';
3+
4+
/**
5+
* 二路快排
6+
*/
7+
class QuickSort3way {
8+
_QuickSort3way() {}
9+
10+
static sort3ways(List arr) {
11+
Random rnd = new Random();
12+
_sort3waysDetail(arr, 0, arr.length - 1, rnd);
13+
}
14+
15+
static _sort3waysDetail(List arr, int left, int right, Random rnd) {
16+
if (left >= right) return;
17+
// 生成 [l, r] 之间的随机索引
18+
int p = left + rnd.nextInt(right - left + 1);
19+
_swap(arr, left, p);
20+
// arr[l + 1, lt] < v, arr[lt + 1, i - 1] == v, arr[gt, r] > v
21+
int lt = left, i = left + 1, gt = right + 1;
22+
while(i < gt){
23+
if(arr[i].compareTo(arr[left]) < 0){
24+
lt ++;
25+
_swap(arr, i, lt);
26+
i ++;
27+
}
28+
else if(arr[i].compareTo(arr[left]) > 0){
29+
gt --;
30+
_swap(arr, i, gt);
31+
}
32+
else{ // arr[i] == v
33+
i ++;
34+
}
35+
}
36+
_swap(arr, left, lt);
37+
// 递归调用
38+
_sort3waysDetail(arr, left, lt - 1, rnd);
39+
_sort3waysDetail(arr, gt, right, rnd);
40+
}
41+
42+
static int _partition3ways(List arr, int l, int r, Random rnd) {
43+
int p = l + rnd.nextInt(r - l + 1);
44+
_swap(arr, l, p);
45+
// arr[l+1...i-1] <= v; arr[j+1...r] >= v
46+
int i = l + 1, j = r;
47+
while (true) {
48+
while (i <= j && arr[i].compareTo(arr[l]) < 0){
49+
i++;
50+
}
51+
while (j >= i && arr[j].compareTo(arr[l]) > 0){
52+
j--;
53+
}
54+
if (i >= j){
55+
break;
56+
}
57+
_swap(arr, i, j);
58+
i++;
59+
j--;
60+
}
61+
_swap(arr, l, j);
62+
return j;
63+
}
64+
65+
static _swap(List arr, int i, int j) {
66+
var t = arr[i];
67+
arr[i] = arr[j];
68+
arr[j] = t;
69+
}
70+
}
71+
72+
void main() {
73+
int n = 1000;
74+
List arr2 = ArrayGenerator.generateRandomArray(n, n);
75+
print(arr2);
76+
QuickSort3way.sort3ways(arr2);
77+
print(arr2);
78+
}

08-QuickSort/QuickSort.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'ArrayGenerator.dart';
2+
import 'dart:math';
23
class QuickSort{
34
_QuickSort(){
45
}
@@ -16,6 +17,9 @@ class QuickSort{
1617
}
1718

1819
static int _partition(List arr,int left,int right){
20+
//优化中间值选取,采用随机方式
21+
int p = left+(new Random().nextInt(right-left+1));
22+
_swap(arr, left, p);
1923
int j =left;
2024
for(var i = left+1;i<=right;i++){
2125
if(arr[i].compareTo(arr[left])<0){

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
5. 链表,链表实现栈,链表实现队列
1010
6. 递归
1111
7. 归并排序,归并排序排序优化,自底向上排序
12-
8. 快速排序
12+
8. 快速排序,快速排序优化,二路快排,三路快排
1313

1414
#### SDK版本
1515
1. 版本:2.12.3

0 commit comments

Comments
 (0)