Skip to content

Commit 88b7b43

Browse files
committed
🐎 refactor sort transform from O(n^2) to O(n)
plus whatever Array.sort is of course... O(n log(n)) or whatever
1 parent 7044a13 commit 88b7b43

File tree

1 file changed

+10
-19
lines changed

1 file changed

+10
-19
lines changed

src/transforms/sort.js

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -116,27 +116,18 @@ exports.calcTransform = function(gd, trace, opts) {
116116
};
117117

118118
function getIndices(opts, targetArray, d2c, len) {
119+
var sortedArray = new Array(len);
119120
var indices = new Array(len);
121+
var i;
120122

121-
var sortedArray = targetArray
122-
.slice(0, len)
123-
.sort(getSortFunc(opts, d2c));
124-
125-
for(var i = 0; i < len; i++) {
126-
var vTarget = targetArray[i];
127-
128-
for(var j = 0; j < len; j++) {
129-
var vSorted = sortedArray[j];
123+
for(i = 0; i < len; i++) {
124+
sortedArray[i] = {v: targetArray[i], i: i};
125+
}
130126

131-
if(vTarget === vSorted) {
132-
indices[j] = i;
127+
sortedArray.sort(getSortFunc(opts, d2c));
133128

134-
// clear sortedArray item to get correct
135-
// index of duplicate items (if any)
136-
sortedArray[j] = null;
137-
break;
138-
}
139-
}
129+
for(i = 0; i < len; i++) {
130+
indices[i] = sortedArray[i].i;
140131
}
141132

142133
return indices;
@@ -145,8 +136,8 @@ function getIndices(opts, targetArray, d2c, len) {
145136
function getSortFunc(opts, d2c) {
146137
switch(opts.order) {
147138
case 'ascending':
148-
return function(a, b) { return d2c(a) - d2c(b); };
139+
return function(a, b) { return d2c(a.v) - d2c(b.v); };
149140
case 'descending':
150-
return function(a, b) { return d2c(b) - d2c(a); };
141+
return function(a, b) { return d2c(b.v) - d2c(a.v); };
151142
}
152143
}

0 commit comments

Comments
 (0)