Skip to content

Commit d7f0dc1

Browse files
committed
loose constrain on generic arg
1 parent b659811 commit d7f0dc1

File tree

14 files changed

+264
-159
lines changed

14 files changed

+264
-159
lines changed

benches/sort.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn small_merge_v1(b: &mut Bencher) {
1010
b.iter(|| {
1111
let mut numbs = [1, 2, 4, 8, 9, 9, 13, 17, 22];
1212
let f = |x: i32, y: i32| x > y;
13-
sort::merge::v1::sort(&mut numbs, f);
13+
sort::merge::v1::sort(&mut numbs, &f);
1414
});
1515
}
1616

@@ -20,7 +20,7 @@ fn large_merge_v1(b: &mut Bencher) {
2020
b.iter(|| {
2121
let mut numbs = data.clone();
2222
let f = |x: i32, y: i32| x > y;
23-
sort::merge::v1::sort(&mut numbs, f);
23+
sort::merge::v1::sort(&mut numbs, &f);
2424
});
2525
}
2626

@@ -30,7 +30,7 @@ fn large_sorted_asc_merge_v1(b: &mut Bencher) {
3030
b.iter(|| {
3131
let mut numbs = data.clone();
3232
let f = |x: i32, y: i32| x > y;
33-
sort::merge::v1::sort(&mut numbs, f);
33+
sort::merge::v1::sort(&mut numbs, &f);
3434
});
3535
}
3636

@@ -40,7 +40,7 @@ fn large_sorted_desc_merge_v1(b: &mut Bencher) {
4040
b.iter(|| {
4141
let mut numbs = data.clone();
4242
let f = |x: i32, y: i32| x > y;
43-
sort::merge::v1::sort(&mut numbs, f);
43+
sort::merge::v1::sort(&mut numbs, &f);
4444
});
4545
}
4646

@@ -50,7 +50,7 @@ fn eq_data_merge_v1(b: &mut Bencher) {
5050
b.iter(|| {
5151
let mut numbs = data.clone();
5252
let f = |x: i32, y: i32| x > y;
53-
sort::merge::v1::sort(&mut numbs, f);
53+
sort::merge::v1::sort(&mut numbs, &f);
5454
});
5555
}
5656

@@ -59,7 +59,7 @@ fn small_merge_v2(b: &mut Bencher) {
5959
b.iter(|| {
6060
let mut numbs = [1, 2, 4, 8, 9, 9, 13, 17, 22];
6161
let f = |x: i32, y: i32| x > y;
62-
sort::merge::v2::sort(&mut numbs, f);
62+
sort::merge::v2::sort(&mut numbs, &f);
6363
});
6464
}
6565

@@ -69,7 +69,7 @@ fn large_merge_v2(b: &mut Bencher) {
6969
b.iter(|| {
7070
let mut numbs = data.clone();
7171
let f = |x: i32, y: i32| x > y;
72-
sort::merge::v2::sort(&mut numbs, f);
72+
sort::merge::v2::sort(&mut numbs, &f);
7373
});
7474
}
7575

@@ -79,7 +79,7 @@ fn large_sorted_asc_merge_v2(b: &mut Bencher) {
7979
b.iter(|| {
8080
let mut numbs = data.clone();
8181
let f = |x: i32, y: i32| x > y;
82-
sort::merge::v2::sort(&mut numbs, f);
82+
sort::merge::v2::sort(&mut numbs, &f);
8383
});
8484
}
8585

@@ -89,7 +89,7 @@ fn large_sorted_desc_merge_v2(b: &mut Bencher) {
8989
b.iter(|| {
9090
let mut numbs = data.clone();
9191
let f = |x: i32, y: i32| x > y;
92-
sort::merge::v2::sort(&mut numbs, f);
92+
sort::merge::v2::sort(&mut numbs, &f);
9393
});
9494
}
9595

@@ -99,7 +99,7 @@ fn eq_data_merge_v2(b: &mut Bencher) {
9999
b.iter(|| {
100100
let mut numbs = data.clone();
101101
let f = |x: i32, y: i32| x > y;
102-
sort::merge::v2::sort(&mut numbs, f);
102+
sort::merge::v2::sort(&mut numbs, &f);
103103
});
104104
}
105105

@@ -108,7 +108,7 @@ fn small_merge_v3(b: &mut Bencher) {
108108
b.iter(|| {
109109
let mut numbs = [1, 2, 4, 8, 9, 9, 13, 17, 22];
110110
let f = |x: i32, y: i32| x > y;
111-
sort::merge::v3::sort(&mut numbs, f);
111+
sort::merge::v3::sort(&mut numbs, &f);
112112
});
113113
}
114114

@@ -118,7 +118,7 @@ fn large_merge_v3(b: &mut Bencher) {
118118
b.iter(|| {
119119
let mut numbs = data.clone();
120120
let f = |x: i32, y: i32| x > y;
121-
sort::merge::v3::sort(&mut numbs, f);
121+
sort::merge::v3::sort(&mut numbs, &f);
122122
});
123123
}
124124

@@ -128,7 +128,7 @@ fn large_sorted_asc_merge_v3(b: &mut Bencher) {
128128
b.iter(|| {
129129
let mut numbs = data.clone();
130130
let f = |x: i32, y: i32| x > y;
131-
sort::merge::v3::sort(&mut numbs, f);
131+
sort::merge::v3::sort(&mut numbs, &f);
132132
});
133133
}
134134

@@ -138,7 +138,7 @@ fn large_sorted_desc_merge_v3(b: &mut Bencher) {
138138
b.iter(|| {
139139
let mut numbs = data.clone();
140140
let f = |x: i32, y: i32| x > y;
141-
sort::merge::v3::sort(&mut numbs, f);
141+
sort::merge::v3::sort(&mut numbs, &f);
142142
});
143143
}
144144

@@ -148,16 +148,16 @@ fn eq_data_merge_v3(b: &mut Bencher) {
148148
b.iter(|| {
149149
let mut numbs = data.clone();
150150
let f = |x: i32, y: i32| x > y;
151-
sort::merge::v3::sort(&mut numbs, f);
151+
sort::merge::v3::sort(&mut numbs, &f);
152152
});
153153
}
154154

155155
#[bench]
156156
fn small_quick(b: &mut Bencher) {
157157
b.iter(|| {
158158
let mut numbs = [1, 2, 4, 8, 9, 9, 13, 17, 22];
159-
let f = |x: i32, y: i32| x > y;
160-
sort::quick::sort(&mut numbs, f);
159+
let f = |x: &i32, y: &i32| x > y;
160+
sort::quick::sort(&mut numbs, &f);
161161
});
162162
}
163163

@@ -166,8 +166,8 @@ fn large_quick(b: &mut Bencher) {
166166
let data = util::random_data(util::DATA_LEN);
167167
b.iter(|| {
168168
let mut numbs = data.clone();
169-
let f = |x: i32, y: i32| x > y;
170-
sort::quick::sort(&mut numbs, f);
169+
let f = |x: &i32, y: &i32| x > y;
170+
sort::quick::sort(&mut numbs, &f);
171171
});
172172
}
173173

@@ -176,8 +176,8 @@ fn large_sorted_asc_quick(b: &mut Bencher) {
176176
let data = util::sorted_data_asc(util::DATA_LEN);
177177
b.iter(|| {
178178
let mut numbs = data.clone();
179-
let f = |x: i32, y: i32| x > y;
180-
sort::quick::sort(&mut numbs, f);
179+
let f = |x: &i32, y: &i32| x > y;
180+
sort::quick::sort(&mut numbs, &f);
181181
});
182182
}
183183

@@ -186,8 +186,8 @@ fn large_sorted_desc_quick(b: &mut Bencher) {
186186
let data = util::sorted_data_desc(util::DATA_LEN);
187187
b.iter(|| {
188188
let mut numbs = data.clone();
189-
let f = |x: i32, y: i32| x > y;
190-
sort::quick::sort(&mut numbs, f);
189+
let f = |x: &i32, y: &i32| x > y;
190+
sort::quick::sort(&mut numbs, &f);
191191
});
192192
}
193193

@@ -196,8 +196,8 @@ fn eq_data_quick(b: &mut Bencher) {
196196
let data = util::eq_data(util::DATA_LEN);
197197
b.iter(|| {
198198
let mut numbs = data.clone();
199-
let f = |x: i32, y: i32| x > y;
200-
sort::quick::sort(&mut numbs, f);
199+
let f = |x: &i32, y: &i32| x > y;
200+
sort::quick::sort(&mut numbs, &f);
201201
});
202202
}
203203

src/common/heap.rs

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,26 @@ macro_rules! parent {
3030
}
3131

3232
// 用数组实现隐式二叉堆
33-
pub struct BinaryHeap<K, F> {
33+
pub struct BinaryHeap<K> {
3434
keys: Vec<K>,
35-
test: F,
3635
}
3736

38-
impl<K, F> BinaryHeap<K, F>
37+
impl<K> BinaryHeap<K>
3938
where
4039
K: Copy,
41-
F: Fn(K, K) -> bool + Copy,
4240
{
43-
pub fn new(mut keys: Vec<K>, test: F) -> Self {
41+
pub fn new<F>(mut keys: Vec<K>, test: &F) -> Self
42+
where
43+
F: Fn(K, K) -> bool,
44+
{
4445
build_heap(&mut keys, test);
45-
Self { keys, test }
46+
Self { keys }
4647
}
4748

48-
pub fn pop(&mut self) -> Option<K> {
49+
pub fn pop<F>(&mut self, test: &F) -> Option<K>
50+
where
51+
F: Fn(K, K) -> bool,
52+
{
4953
let len = self.keys.len();
5054
if len > 0 {
5155
// 从长度为 n 的数组中删除第一个元素需要线性时间 O(n)。
@@ -55,18 +59,19 @@ where
5559
// 个元素,然后将数组的长度减一。
5660
self.keys.swap(0, len - 1);
5761
let key = self.keys.pop();
58-
let test = self.test;
5962
heapify(&mut self.keys, 0, test);
6063
key
6164
} else {
6265
None
6366
}
6467
}
6568

66-
pub fn set(&mut self, i: usize, key: K) {
69+
pub fn set<F>(&mut self, i: usize, key: K, test: &F)
70+
where
71+
F: Fn(K, K) -> bool,
72+
{
6773
match self.keys.get(i) {
6874
Some(v) => {
69-
let test = self.test;
7075
if test(key, *v) {
7176
self.keys[i] = key;
7277
heap_fix(&mut self.keys, i, test);
@@ -76,8 +81,10 @@ where
7681
}
7782
}
7883

79-
pub fn insert(&mut self, key: K) {
80-
let test = self.test;
84+
pub fn insert<F>(&mut self, key: K, test: &F)
85+
where
86+
F: Fn(K, K) -> bool,
87+
{
8188
let i = self.keys.len();
8289
self.keys.push(key);
8390
heap_fix(&mut self.keys, i, test);
@@ -89,10 +96,10 @@ where
8996
}
9097
}
9198

92-
pub fn heapify<K, F>(keys: &mut [K], mut i: usize, test: F)
99+
pub fn heapify<K, F>(keys: &mut [K], mut i: usize, test: &F)
93100
where
94101
K: Copy,
95-
F: Fn(K, K) -> bool + Copy,
102+
F: Fn(K, K) -> bool,
96103
{
97104
let n = keys.len();
98105
loop {
@@ -121,34 +128,31 @@ where
121128
}
122129
}
123130

124-
pub fn build_heap<K, F>(keys: &mut [K], test: F)
131+
pub fn build_heap<K, F>(keys: &mut [K], test: &F)
125132
where
126133
K: Copy,
127-
F: Fn(K, K) -> bool + Copy,
134+
F: Fn(K, K) -> bool,
128135
{
129136
// i以 n / 2作为第一个分支节点,开始构建heap。
130137
// 因为叶子结点,已经满足堆定义,所以从二叉树倒数第二层最后一个节点
131138
// 开始构建,这个分支节点的index,根据等比数列求和公式得到:
132139
// (2 ^ 0 + 2 ^ 1 ... 2 ^ (p - 1) = 2 ^ (p - 1) - 1)
133140
// p为二叉树层数等于log(n)
134141
// index = 2 ^ (p - 1) - 1 = 2 ^ ( log(n) - 1) - 1 <= n / 2
135-
let mut i = keys.len() / 2;
136-
loop {
137-
heapify(keys, i, test);
138-
if i == 0 {
139-
break;
140-
} else {
141-
i -= 1;
142-
}
142+
let mut i = keys.len() as i32 / 2;
143+
while i >= 0 {
144+
heapify(keys, i as usize, test);
145+
i -= 1;
143146
}
144147
}
145148

146149
// 与heapify的区别:
147150
// heapify 是从i节点开始,调整子树 (向下调整)
148151
// heap_fix 是从i节点开始,调整父节点(向上调整)
149-
fn heap_fix<K: Copy, F>(keys: &mut [K], mut i: usize, test: F)
152+
fn heap_fix<K, F>(keys: &mut [K], mut i: usize, test: &F)
150153
where
151-
F: Fn(K, K) -> bool + Copy,
154+
K: Copy,
155+
F: Fn(K, K) -> bool,
152156
{
153157
while i > 0 {
154158
let parent = parent!(i);

src/sort/bubble.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@
1313
//! 若初始状态反序,时间复杂度 O(n^2)
1414
//! 稳定排序算法
1515
16-
pub fn sort<T: Copy, F>(a: &mut [T], test: F)
16+
pub fn sort<T, F>(a: &mut [T], compare: F)
1717
where
18-
F: Fn(T, T) -> bool + Copy,
18+
F: Fn(&T, &T) -> bool,
1919
{
2020
let len = a.len();
2121
for i in 0..len.saturating_sub(1) {
2222
let mut swapped = false;
2323

2424
for j in 0..(len - 1 - i) {
25-
if test(a[j], a[j + 1]) {
25+
if compare(&a[j], &a[j + 1]) {
2626
a.swap(j, j + 1);
2727
swapped = true;
2828
}

src/sort/heap.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
66
use crate::common::heap::{self, BinaryHeap};
77

8-
pub fn sort<T: Copy, F>(a: &[T], test: F) -> Vec<T>
8+
pub fn sort<T, F>(a: &[T], compare: &F) -> Vec<T>
99
where
10-
F: Fn(T, T) -> bool + Copy,
10+
T: Copy,
11+
F: Fn(T, T) -> bool,
1112
{
1213
let data = Vec::from(a);
13-
let mut heap = BinaryHeap::new(data, test);
14+
let mut heap = BinaryHeap::new(data, compare);
1415
let mut res = Vec::with_capacity(a.len());
15-
while let Some(v) = heap.pop() {
16+
while let Some(v) = heap.pop(compare) {
1617
res.push(v);
1718
}
1819
res
@@ -25,15 +26,18 @@ where
2526
/// 这一算法是原地排序的,无需使用额外的空间来存储结果
2627
///
2728
/// 就地排序,小 -> 大
28-
pub fn floyd_sort<T: Copy + std::cmp::PartialOrd>(a: &mut [T]) {
29+
pub fn floyd_sort<T>(a: &mut [T])
30+
where
31+
T: Copy + std::cmp::PartialOrd,
32+
{
2933
// 构建最大堆
30-
let test = |x: T, y: T| x >= y;
31-
heap::build_heap(a, test);
34+
let compare = |x: T, y: T| x >= y;
35+
heap::build_heap(a, &compare);
3236

3337
let mut i = a.len();
3438
while i > 1 {
3539
i -= 1;
3640
a.swap(0, i);
37-
heap::heapify(&mut a[0..i], 0, test);
41+
heap::heapify(&mut a[0..i], 0, &compare);
3842
}
3943
}

0 commit comments

Comments
 (0)