Skip to content

Commit 6c80ed8

Browse files
test and fix Ford-Johnson implementation
fix #33
1 parent f0f361b commit 6c80ed8

File tree

6 files changed

+118
-98
lines changed

6 files changed

+118
-98
lines changed

js/dist/sort.js

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -430,87 +430,90 @@
430430

431431
/* js/src/sort/fordjohnson.js */
432432

433-
var fordjohnson = function fordjohnson(compare, swap, a, i, j) {
433+
var _fordjohnson = function _fordjohnson(binarysearch) {
434434

435-
var m, k, t, y, p, q, r, x, l, w, s, pairswap;
435+
var fordjohnson = function fordjohnson(compare, swap, a, i, j) {
436436

437-
k = m = (j - i) / 2 | 0;
437+
var m, k, t, y, p, q, r, x, l, w, s, pairswap;
438438

439-
// compare pairs of elements and put largest elements at the front of the
440-
// array
439+
if (j - i < 2) return;
441440

442-
while (k--) {
441+
k = m = (j - i) / 2 | 0;
443442

444-
if (compare(a[i + k], a[i + m + k]) < 0) {
443+
// compare pairs of elements and put largest elements at the front of the
444+
// array
445445

446-
swap(a, i + k, i + m + k);
447-
}
448-
}
446+
while (k--) {
449447

450-
// sort the largest elements at the front recursively
448+
if (compare(a[i + k], a[i + m + k]) < 0) {
451449

452-
pairswap = function (a, i, j) {
453-
swap(a, i, j);
454-
swap(a, i + m, j + m);
455-
};
450+
swap(a, i + k, i + m + k);
451+
}
452+
}
456453

457-
fordjohnson(compare, pairswap, a, i, i + m);
454+
// sort the largest elements at the front recursively
458455

459-
// merge the rest of the array into the front, one item at a time
456+
pairswap = function (a, i, j) {
457+
swap(a, i, j);
458+
swap(a, i + m, j + m);
459+
};
460460

461-
p = y = t = 1;
461+
fordjohnson(compare, pairswap, a, i, i + m);
462462

463-
q = 0;
463+
// merge the rest of the array into the front, one item at a time
464464

465-
while (i + m + t <= j) {
465+
p = y = t = 1;
466466

467-
r = t;
467+
q = 0;
468468

469-
while (r-- > q) {
469+
while (i + m + t <= j) {
470470

471-
w = a[i + m + t - 1];
471+
r = t;
472472

473-
x = binarysearch(compare, a, i, i + t - 1, w);
474-
l = x[0] + x[1];
473+
while (r-- > q) {
475474

476-
swap(a, i + m + q, i + m + t - 1);
475+
w = a[i + m + t - 1];
477476

478-
s = i + m + t;
477+
x = binarysearch(compare, a, i, i + m + q, w);
478+
l = x[0] + x[1];
479479

480-
while (--s > l) {
480+
s = i + m + t;
481481

482-
swap(a, s, s - 1);
483-
}
484-
}
482+
while (--s > l) {
485483

486-
q = t;
484+
swap(a, s, s - 1);
485+
}
486+
}
487487

488-
p *= 2;
489-
y = p - 2 * t;
490-
t += y;
491-
}
488+
q = t;
492489

493-
r = j - i - m;
490+
p *= 2;
491+
y = p - 2 * t;
492+
t += y;
493+
}
494494

495-
while (r-- > q) {
495+
r = j - i - m;
496496

497-
w = a[i + m + t - 1];
497+
while (r-- > q) {
498498

499-
x = binarysearch(compare, a, i, i + t - 1, w);
500-
l = x[0] + x[1];
499+
w = a[j - 1];
501500

502-
swap(a, i + m + q, i + m + t - 1);
501+
x = binarysearch(compare, a, i, i + m + q, w);
502+
l = x[0] + x[1];
503503

504-
s = i + m + t;
504+
s = j;
505505

506-
while (--s > l) {
506+
while (--s > l) {
507507

508-
swap(a, s, s - 1);
508+
swap(a, s, s - 1);
509+
}
509510
}
510-
}
511+
};
512+
513+
return fordjohnson;
511514
};
512515

513-
exports.fordjohnson = fordjohnson;
516+
exports._fordjohnson = _fordjohnson;
514517

515518
/* js/src/sort/heapsort.js */
516519

js/dist/sort.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/dist/sort.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/src/sort/fordjohnson.js

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,95 @@
11

2-
var fordjohnson = function ( compare , swap , a , i , j ) {
2+
var _fordjohnson = function ( binarysearch ) {
33

4-
var m , k , t , y , p , q , r , x , l , w , s , pairswap ;
4+
var fordjohnson = function ( compare , swap , a , i , j ) {
55

6-
k = m = ( j - i ) / 2 | 0 ;
6+
var m , k , t , y , p , q , r , x , l , w , s , pairswap ;
77

8-
// compare pairs of elements and put largest elements at the front of the
9-
// array
8+
if ( j - i < 2 ) return ;
109

11-
while ( k-- ) {
10+
k = m = ( j - i ) / 2 | 0 ;
1211

13-
if ( compare( a[i+k] , a[i+m+k] ) < 0 ) {
12+
// compare pairs of elements and put largest elements at the front of the
13+
// array
1414

15-
swap( a , i + k , i + m + k ) ;
15+
while ( k-- ) {
1616

17-
}
17+
if ( compare( a[i+k] , a[i+m+k] ) < 0 ) {
1818

19-
}
19+
swap( a , i + k , i + m + k ) ;
2020

21-
// sort the largest elements at the front recursively
21+
}
2222

23-
pairswap = function ( a , i , j ) {
24-
swap( a , i , j ) ;
25-
swap( a , i + m , j + m ) ;
26-
} ;
23+
}
2724

28-
fordjohnson( compare , pairswap , a , i , i + m ) ;
25+
// sort the largest elements at the front recursively
2926

30-
// merge the rest of the array into the front, one item at a time
27+
pairswap = function ( a , i , j ) {
28+
swap( a , i , j ) ;
29+
swap( a , i + m , j + m ) ;
30+
} ;
3131

32-
p = y = t = 1 ;
32+
fordjohnson( compare , pairswap , a , i , i + m ) ;
3333

34-
q = 0 ;
34+
// merge the rest of the array into the front, one item at a time
3535

36-
while ( i + m + t <= j ) {
36+
p = y = t = 1 ;
3737

38-
r = t ;
38+
q = 0 ;
3939

40-
while ( r --> q ) {
40+
while ( i + m + t <= j ) {
4141

42-
w = a[i+m+t-1] ;
42+
r = t ;
4343

44-
x = binarysearch( compare , a , i , i + t - 1 , w ) ;
45-
l = x[0] + x[1] ;
44+
while ( r --> q ) {
4645

47-
swap( a , i + m + q , i + m + t - 1 ) ;
46+
w = a[i+m+t-1] ;
4847

49-
s = i + m + t ;
48+
x = binarysearch( compare , a , i , i + m + q , w ) ;
49+
l = x[0] + x[1] ;
5050

51-
while ( --s > l ) {
51+
s = i + m + t ;
5252

53-
swap( a , s , s - 1 ) ;
53+
while ( --s > l ) {
54+
55+
swap( a , s , s - 1 ) ;
56+
57+
}
5458

5559
}
5660

57-
}
61+
q = t ;
5862

59-
q = t ;
63+
p *= 2 ;
64+
y = p - 2 * t ;
65+
t += y ;
6066

61-
p *= 2 ;
62-
y = p - 2 * t ;
63-
t += y ;
67+
}
6468

65-
}
69+
r = j - i - m ;
6670

67-
r = j - i - m ;
71+
while ( r --> q ) {
6872

69-
while ( r --> q ) {
73+
w = a[j-1] ;
7074

71-
w = a[i+m+t-1] ;
75+
x = binarysearch( compare , a , i , i + m + q , w ) ;
76+
l = x[0] + x[1] ;
7277

73-
x = binarysearch( compare , a , i , i + t - 1 , w ) ;
74-
l = x[0] + x[1] ;
78+
s = j ;
7579

76-
swap( a , i + m + q , i + m + t - 1 ) ;
80+
while ( --s > l ) {
7781

78-
s = i + m + t ;
82+
swap( a , s , s - 1 ) ;
7983

80-
while ( --s > l ) {
84+
}
8185

82-
swap( a , s , s - 1 ) ;
8386

8487
}
8588

86-
}
89+
} ;
8790

91+
return fordjohnson ;
8892

8993
} ;
9094

91-
exports.fordjohnson = fordjohnson ;
95+
exports._fordjohnson = _fordjohnson ;

test/js/src/inplacesort.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11

2-
var util, array, random, compare, itertools, functools;
2+
var util, array, search, random, compare, itertools, functools;
33

44
util = require( "util" );
55
array = require( "aureooms-js-array" );
6+
search = require( "aureooms-js-search" );
67
random = require( "aureooms-js-random" );
78
compare = require( "aureooms-js-compare" );
89
itertools = require( "aureooms-js-itertools" );
@@ -65,7 +66,12 @@ itertools.product( [
6566
[ "dualpivotquicksort (yaroslavskiy)", sort.__dualpivotquicksort__( sort.yaroslavskiy ) ],
6667
[ "insertionsort", sort.insertionsort ],
6768
[ "selectionsort", sort.selectionsort ],
68-
[ "bubblesort", sort.bubblesort ]
69+
[ "bubblesort", sort.bubblesort ],
70+
[ "fordjohnson" , function ( compare , a , i , j ) {
71+
72+
sort._fordjohnson( search.binarysearch )( compare , array.swap , a , i , j ) ;
73+
74+
} ]
6975
],
7076

7177
[

test/js/src/whole.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var util, array, random, compare, itertools, functools;
22

33
util = require( "util" );
44
array = require( "aureooms-js-array" );
5+
search = require( "aureooms-js-search" );
56
random = require( "aureooms-js-random" );
67
compare = require( "aureooms-js-compare" );
78
itertools = require( "aureooms-js-itertools" );
@@ -62,7 +63,13 @@ itertools.product( [
6263
[ "dualpivotquicksort (yaroslavskiy)", sort.__dualpivotquicksort__( sort.yaroslavskiy ) ],
6364
[ "insertionsort", sort.insertionsort ],
6465
[ "selectionsort", sort.selectionsort ],
65-
[ "bubblesort", sort.bubblesort ]
66+
[ "bubblesort", sort.bubblesort ],
67+
[ "fordjohnson" , function ( compare , a , i , j ) {
68+
69+
sort._fordjohnson( search.binarysearch )( compare , array.swap , a , i , j ) ;
70+
71+
} ]
72+
6673
],
6774

6875
[

0 commit comments

Comments
 (0)