1 | "use strict";
|
2 |
|
3 | var SortingAnimations = function (canvas) {
|
4 |
|
5 | var ctx = canvas.getContext ? canvas.getContext("2d") : null;
|
6 |
|
7 | var lineWidth = 9;
|
8 | var updateCost = 50;
|
9 | var compareCost = 30;
|
10 |
|
11 | var randomArray = function () {
|
12 | var array = [];
|
13 | var length = Math.floor(canvas.width / (lineWidth + 1));
|
14 |
|
15 | for (var i = 1; i <= length; i++) {
|
16 | array.push(i);
|
17 | }
|
18 |
|
19 | array.sort(function() { return (Math.round(Math.random()) - 0.5); });
|
20 | return array;
|
21 | }
|
22 |
|
23 | var paint = function (array, updating) {
|
24 |
|
25 | ctx.clearRect(0, 0, canvas.width, canvas.height);
|
26 | ctx.lineWidth = lineWidth;
|
27 |
|
28 | for (var i = 0; i < array.length; i++)
|
29 | {
|
30 | var x = (lineWidth + 1) * i + lineWidth / 2;
|
31 | var height = array[i] * (lineWidth + 1) * canvas.height / canvas.width;
|
32 |
|
33 | ctx.beginPath();
|
34 |
|
35 | if (updating && updating.indexOf(i) >= 0) {
|
36 | ctx.strokeStyle = "red";
|
37 | } else {
|
38 | ctx.strokeStyle = "black";
|
39 | }
|
40 |
|
41 | ctx.moveTo(x, canvas.height);
|
42 | ctx.lineTo(x, canvas.height - height);
|
43 |
|
44 | ctx.stroke();
|
45 | }
|
46 | }
|
47 |
|
48 | var compareAsync = function (x, y, callback) {
|
49 | setTimeout(cont(), compareCost);
|
50 | callback(x - y);
|
51 | };
|
52 |
|
53 | var swapAsync = function (array, i, j, callback) {
|
54 | var t = array[i];
|
55 | array[i] = array[j];
|
56 | array[j] = t;
|
57 |
|
58 | paint(array, [i, j]);
|
59 | setTimeout(cont(), updateCost);
|
60 | callback();
|
61 | };
|
62 |
|
63 | var assignAsync = function (array, i, value, updating, callback) {
|
64 | array[i] = value;
|
65 | paint(array, updating);
|
66 | setTimeout(cont(), updateCost);
|
67 | callback();
|
68 | };
|
69 |
|
70 | var sortOperations = {
|
71 |
|
72 | Bubble: function (array, callback) {
|
73 | for (var i = 0; i < array.length; i++) {
|
74 | for (var j = 0; j < array.length - i - 1; j++) {
|
75 | compareAsync(array[j], array[j + 1], cont(r));
|
76 | if (r > 0) swapAsync(array, j, j + 1, cont());
|
77 | }
|
78 | }
|
79 | callback();
|
80 | },
|
81 |
|
82 | Quick: function (array, callback) {
|
83 |
|
84 | var partitionAsync = function (begin, end, callback) {
|
85 | var i = begin;
|
86 | var j = end;
|
87 | var pivot = array[Math.floor((begin + end) / 2)];
|
88 |
|
89 | while (i <= j) {
|
90 | while (true) {
|
91 | compareAsync(array[i], pivot, cont(r));
|
92 | if (r < 0) { i++; } else { break; }
|
93 | }
|
94 |
|
95 | while (true) {
|
96 | compareAsync(array[j], pivot, cont(r));
|
97 | if (r > 0) { j--; } else { break; }
|
98 | }
|
99 |
|
100 | if (i <= j) {
|
101 | swapAsync(array, i, j, cont());
|
102 | i++;
|
103 | j--;
|
104 | }
|
105 | }
|
106 |
|
107 | callback(i);
|
108 | };
|
109 |
|
110 | var sortAsync = function (begin, end, callback) {
|
111 | partitionAsync(begin, end, cont(index));
|
112 |
|
113 | if (begin < index - 1)
|
114 | sortAsync(begin, index - 1, cont());
|
115 |
|
116 | if (index < end)
|
117 | sortAsync(index, end, cont());
|
118 | callback();
|
119 | };
|
120 |
|
121 | sortAsync(0, array.length - 1, cont());
|
122 | callback();
|
123 | },
|
124 |
|
125 | Selection: function (array, callback) {
|
126 | for(var j = 0; j < array.length - 1; j++) {
|
127 | var mi = j;
|
128 | for (var i = j + 1; i < array.length; i++) {
|
129 | compareAsync(array[i], array[mi], cont(r));
|
130 | if (r < 0) { mi = i; }
|
131 | }
|
132 |
|
133 | swapAsync(array, mi, j, cont());
|
134 | }
|
135 | callback();
|
136 | },
|
137 |
|
138 | Shell: function (array, callback) {
|
139 | var gaps = [701, 301, 132, 57, 23, 10, 4, 1];
|
140 |
|
141 | for (var gap = Math.floor(array.length / 2); gap > 0; gap = Math.floor(gap / 2)) {
|
142 | for (var i = gap; i < array.length; i++) {
|
143 | var temp = array[i];
|
144 |
|
145 | var j;
|
146 | for (j = i; j >= gap; j -= gap) {
|
147 | compareAsync(temp, array[j - gap], cont(r));
|
148 |
|
149 | if (r < 0) {
|
150 | assignAsync(array, j, array[j - gap], null, cont());
|
151 | } else {
|
152 | break;
|
153 | }
|
154 | }
|
155 |
|
156 | assignAsync(array, j, temp, [j], cont());
|
157 | }
|
158 | }
|
159 | callback();
|
160 | }
|
161 | };
|
162 |
|
163 | this.supported = !!ctx;
|
164 | this.randomArray = randomArray;
|
165 | this.paint = paint;
|
166 |
|
167 | this.names = [];
|
168 |
|
169 | var self = this;
|
170 | Object.keys(sortOperations).forEach(function (m) {
|
171 | self.names.push(m);
|
172 | });
|
173 |
|
174 | this.sortAsync = function (name, array, callback) {
|
175 | paint(array);
|
176 | sortOperations[name](array, cont());
|
177 | paint(array);
|
178 | callback();
|
179 | };
|
180 | }; |
\ | No newline at end of file |