UNPKG

4.46 kBJavaScriptView Raw
1"use strict";
2
3var 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