|
8 | 8 |
|
9 | 9 | 'use strict'; |
10 | 10 |
|
| 11 | + function compare(a, b) { |
| 12 | + return a - b; |
| 13 | + } |
| 14 | + |
11 | 15 | /** |
12 | 16 | * Quicksort algorithm |
13 | 17 | * |
|
27 | 31 | * @param {number} right Right part of the array |
28 | 32 | * @return {number} |
29 | 33 | */ |
30 | | - function partition(array, left, right) { |
| 34 | + function partition(array, left, right, cmp) { |
31 | 35 | var pivot = array[Math.floor((left + right) / 2)], |
32 | 36 | temp; |
33 | 37 | while (left <= right) { |
34 | | - while (array[left] < pivot) { |
| 38 | + while (cmp(array[left], pivot) < 0) { |
35 | 39 | left += 1; |
36 | 40 | } |
37 | | - while (array[right] > pivot) { |
| 41 | + while (cmp(array[right], pivot) > 0) { |
38 | 42 | right -= 1; |
39 | 43 | } |
40 | 44 | if (left <= right) { |
|
57 | 61 | * @param {number} left Left part of the array which should be processed |
58 | 62 | * @param {number} right Right part of the array which should be processed |
59 | 63 | */ |
60 | | - function quicksort(array, left, right) { |
61 | | - var mid = partition(array, left, right); |
| 64 | + function quicksort(array, left, right, cmp) { |
| 65 | + var mid = partition(array, left, right, cmp); |
62 | 66 | if (left < mid - 1) { |
63 | | - quicksort(array, left, mid - 1); |
| 67 | + quicksort(array, left, mid - 1, cmp); |
64 | 68 | } |
65 | 69 | if (right > mid) { |
66 | | - quicksort(array, mid, right); |
| 70 | + quicksort(array, mid, right, cmp); |
67 | 71 | } |
68 | 72 | } |
69 | 73 |
|
70 | 74 | /** |
71 | 75 | * Quicksort's initial point |
72 | 76 | * @public |
73 | 77 | */ |
74 | | - return function (array) { |
75 | | - quicksort(array, 0, array.length - 1); |
| 78 | + return function (array, cmp) { |
| 79 | + cmp = cmp || compare; |
| 80 | + quicksort(array, 0, array.length - 1, cmp); |
76 | 81 | return array; |
77 | 82 | }; |
78 | 83 |
|
|
0 commit comments