Skip to content

Commit e680504

Browse files
author
Raghuveer Devulapalli
committed
Use the permute array in-line
1 parent 4b4bbf8 commit e680504

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

lib/x86simdsort.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,6 @@
99
#define XSS_HIDE_SYMBOL __attribute__((visibility("hidden")))
1010
#define UNUSED(x) (void)(x)
1111

12-
template <typename T>
13-
XSS_HIDE_SYMBOL void permute_array_in_place(T *A, std::vector<size_t> P)
14-
{
15-
for (size_t i = 0; i < P.size(); i++) {
16-
size_t curr = i;
17-
size_t next = P[curr];
18-
while (next != i) {
19-
std::swap(A[curr], A[next]);
20-
P[curr] = curr;
21-
curr = next;
22-
next = P[next];
23-
}
24-
P[curr] = curr;
25-
}
26-
}
27-
2812
namespace x86simdsort {
2913

3014
// quicksort
@@ -55,14 +39,30 @@ argselect(T *arr, size_t k, size_t arrsize, bool hasnan = false);
5539
template <typename T, typename F>
5640
XSS_EXPORT_SYMBOL void object_qsort(T *arr, size_t arrsize, const F key_func)
5741
{
42+
/* (1) Create a vector a keys */
5843
using return_type_of =
5944
typename decltype(std::function {key_func})::result_type;
60-
std::vector<return_type_of> keys(arrsize);
45+
std::vector<return_type_of> keys;
46+
keys.reserve(arrsize);
6147
for (size_t ii = 0; ii < arrsize; ++ii) {
6248
keys[ii] = key_func(arr[ii]);
6349
}
50+
51+
/* (2) Call argsort based on the keys */
6452
std::vector<size_t> arg = x86simdsort::argsort(keys.data(), arrsize);
65-
permute_array_in_place(arr, arg);
53+
54+
/* (3) Permute array in-place */
55+
for (size_t i = 0; i < arrsize; i++) {
56+
size_t curr = i;
57+
size_t next = arg[curr];
58+
while (next != i) {
59+
std::swap(arr[curr], arr[next]);
60+
arg[curr] = curr;
61+
curr = next;
62+
next = arg[next];
63+
}
64+
arg[curr] = curr;
65+
}
6666
}
6767

6868
} // namespace x86simdsort

0 commit comments

Comments
 (0)