Skip to content

Commit 7a8c818

Browse files
author
tianqing.liang
committed
二分搜索
1 parent 9a21c2b commit 7a8c818

File tree

9 files changed

+401
-2
lines changed

9 files changed

+401
-2
lines changed

08-QuickSort-More/QuickSort3way.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import 'ArrayGenerator.dart';
22
import 'dart:math';
3-
43
/**
5-
* 二路快排
4+
* 三路快排
65
*/
76
class QuickSort3way {
87
_QuickSort3way() {}
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: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'ArrayGenerator.dart';
2+
3+
/**
4+
* 二分搜索
5+
*/
6+
class BinarySearch{
7+
8+
_BinarySearch(){}
9+
10+
static int search<T>(List data,T target){
11+
12+
int left = 0, right = data.length - 1;
13+
14+
// 在 data[l, r] 的范围中查找 target
15+
while(left <= right){
16+
int mid = left + ((right - left) / 2).toInt();
17+
if(data[mid].compareTo(target) == 0)
18+
return mid;
19+
if(data[mid].compareTo(target) < 0)
20+
left = mid + 1;
21+
else
22+
right = mid - 1;
23+
}
24+
return -1;
25+
26+
}
27+
// > target 的最小值索引
28+
static int upper<T>(List arr,T target){
29+
int left = 0,right = arr.length;
30+
while (left < right){
31+
int mid = left +((right -left)/2).toInt();
32+
if(arr[mid].compareTo(target)<=0){
33+
left = mid +1;
34+
}else{
35+
right = mid ;
36+
}
37+
}
38+
return left;
39+
}
40+
41+
// > target ,返回最小值索引
42+
// == target,返回最大索引
43+
static int ceil<T>(List arr,T target){
44+
int u = upper(arr, target);
45+
if(u-1>= 0 && arr[u-1].compareTo(target) == 0){
46+
return u-1;
47+
}
48+
return u;
49+
}
50+
51+
}
52+
53+
void main(){
54+
// int n = 1000;
55+
// List arr2 = ArrayGenerator.generateOrderedArray(n);
56+
// print(BinarySearch.search(arr2, 50));
57+
var arr =[1,1,3,3,5,5,7,7];
58+
for(var i = 0;i<=6;i++){
59+
print(BinarySearch.ceil(arr, i));
60+
}
61+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import 'ArrayGenerator.dart';
2+
3+
/**
4+
* 二分搜索
5+
*/
6+
class BinarySearch {
7+
_BinarySearch() {}
8+
9+
static int search<T>(List data, T target) {
10+
int left = 0, right = data.length - 1;
11+
12+
// 在 data[l, r] 的范围中查找 target
13+
while (left <= right) {
14+
int mid = left + ((right - left) / 2).toInt();
15+
if (data[mid].compareTo(target) == 0) return mid;
16+
if (data[mid].compareTo(target) < 0)
17+
left = mid + 1;
18+
else
19+
right = mid - 1;
20+
}
21+
return -1;
22+
}
23+
24+
// > target 的最小值索引
25+
static int upper<T>(List arr, T target) {
26+
int left = 0, right = arr.length;
27+
while (left < right) {
28+
int mid = left + ((right - left) / 2).toInt();
29+
if (arr[mid].compareTo(target) <= 0) {
30+
left = mid + 1;
31+
} else {
32+
right = mid;
33+
}
34+
}
35+
return left;
36+
}
37+
38+
// > target ,返回最小值索引
39+
// == target,返回最大索引
40+
static int upper_ceil<T>(List arr, T target) {
41+
int u = upper(arr, target);
42+
if (u - 1 >= 0 && arr[u - 1].compareTo(target) == 0) {
43+
return u - 1;
44+
}
45+
return u;
46+
}
47+
48+
// >= target 的最小值索引
49+
static int lower_ceil<T>(List data, T target) {
50+
int left = 0, right = data.length;
51+
// 在 data[l, r] 中寻找解
52+
while (left < right) {
53+
int mid = left + ((right - left) / 2).toInt();
54+
if (data[mid].compareTo(target) < 0)
55+
left = mid + 1;
56+
else
57+
right = mid;
58+
}
59+
return left;
60+
}
61+
62+
// < target 的最大值索引
63+
static int lower<T>(List data, T target) {
64+
int left = -1, right = data.length - 1;
65+
// 在 data[l, r] 中寻找解
66+
while (left < right) {
67+
int mid = left + ((right - left + 1) / 2).toInt();
68+
if (data[mid].compareTo(target) < 0)
69+
left = mid;
70+
else
71+
right = mid - 1;
72+
}
73+
return left;
74+
}
75+
76+
// < target ,返回最大值索引
77+
// == target,返回最小索引
78+
static int lower_floor<T>(List data, T target) {
79+
int l = lower(data, target);
80+
if (l + 1 < data.length && data[l + 1].compareTo(target) == 0) return l + 1;
81+
return l;
82+
}
83+
84+
// <= target 最大索引
85+
static int upper_floor<T>(List data, T target) {
86+
int left = -1, right = data.length - 1;
87+
// 在 data[l, r] 中寻找解
88+
while (left < right) {
89+
int mid = left + ((right - left + 1) / 2).toInt();
90+
if (data[mid].compareTo(target) <= 0)
91+
left= mid;
92+
else
93+
right = mid - 1;
94+
}
95+
return left;
96+
}
97+
}
98+
99+
void main() {
100+
// int n = 1000;
101+
// List arr2 = ArrayGenerator.generateOrderedArray(n);
102+
// print(BinarySearch.search(arr2, 50));
103+
var arr = [1, 1, 3, 3, 5, 5, 7, 7];
104+
for (var i = 0; i <= 6; i++) {
105+
print(BinarySearch.lower(arr, i));
106+
}
107+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import 'ArrayGenerator.dart';
2+
3+
/**
4+
* 二分搜索
5+
*/
6+
class BinarySearch {
7+
_BinarySearch() {}
8+
9+
static int search<T>(List data, T target) {
10+
int left = 0, right = data.length - 1;
11+
12+
// 在 data[l, r] 的范围中查找 target
13+
while (left <= right) {
14+
int mid = left + ((right - left) / 2).toInt();
15+
if (data[mid].compareTo(target) == 0) return mid;
16+
if (data[mid].compareTo(target) < 0)
17+
left = mid + 1;
18+
else
19+
right = mid - 1;
20+
}
21+
return -1;
22+
}
23+
24+
// > target 的最小值索引
25+
static int upper<T>(List arr, T target) {
26+
int left = 0, right = arr.length;
27+
while (left < right) {
28+
int mid = left + ((right - left) / 2).toInt();
29+
if (arr[mid].compareTo(target) <= 0) {
30+
left = mid + 1;
31+
} else {
32+
right = mid;
33+
}
34+
}
35+
return left;
36+
}
37+
38+
// > target ,返回最小值索引
39+
// == target,返回最大索引
40+
static int upper_ceil<T>(List arr, T target) {
41+
int u = upper(arr, target);
42+
if (u - 1 >= 0 && arr[u - 1].compareTo(target) == 0) {
43+
return u - 1;
44+
}
45+
return u;
46+
}
47+
48+
// >= target 的最小值索引
49+
static int lower_ceil<T>(List data, T target) {
50+
int left = 0, right = data.length;
51+
// 在 data[l, r] 中寻找解
52+
while (left < right) {
53+
int mid = left + ((right - left) / 2).toInt();
54+
if (data[mid].compareTo(target) < 0)
55+
left = mid + 1;
56+
else
57+
right = mid;
58+
}
59+
return left;
60+
}
61+
62+
// < target 的最大值索引
63+
static int lower<T>(List data, T target) {
64+
int left = -1, right = data.length - 1;
65+
// 在 data[l, r] 中寻找解
66+
while (left < right) {
67+
int mid = left + ((right - left + 1) / 2).toInt();
68+
if (data[mid].compareTo(target) < 0)
69+
left = mid;
70+
else
71+
right = mid - 1;
72+
}
73+
return left;
74+
}
75+
}
76+
77+
void main() {
78+
// int n = 1000;
79+
// List arr2 = ArrayGenerator.generateOrderedArray(n);
80+
// print(BinarySearch.search(arr2, 50));
81+
var arr = [1, 1, 3, 3, 5, 5, 7, 7];
82+
for (var i = 0; i <= 6; i++) {
83+
print(BinarySearch.lower(arr, i));
84+
}
85+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'ArrayGenerator.dart';
2+
3+
/**
4+
* 二分搜索
5+
*/
6+
class BinarySearch{
7+
8+
_BinarySearch(){}
9+
10+
static int search<T>(List data,T target){
11+
12+
int left = 0, right = data.length - 1;
13+
14+
// 在 data[l, r] 的范围中查找 target
15+
while(left <= right){
16+
int mid = left + ((right - left) / 2).toInt();
17+
if(data[mid].compareTo(target) == 0)
18+
return mid;
19+
if(data[mid].compareTo(target) < 0)
20+
left = mid + 1;
21+
else
22+
right = mid - 1;
23+
}
24+
return -1;
25+
26+
}
27+
// > target 的最小值索引
28+
static int upper<T>(List arr,T target){
29+
int left = 0,right = arr.length;
30+
while (left < right){
31+
int mid = left +((right -left)/2).toInt();
32+
if(arr[mid].compareTo(target)<=0){
33+
left = mid +1;
34+
}else{
35+
right = mid ;
36+
}
37+
}
38+
return left;
39+
}
40+
41+
42+
43+
}
44+
45+
void main(){
46+
// int n = 1000;
47+
// List arr2 = ArrayGenerator.generateOrderedArray(n);
48+
// print(BinarySearch.search(arr2, 50));
49+
var arr =[1,1,3,3,5,5,7,7];
50+
for(var i = 0;i<=6;i++){
51+
print(BinarySearch.upper(arr, i));
52+
}
53+
}
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+
}

0 commit comments

Comments
 (0)