function mergeSort(array:Array):Array { var chunkSize:int = array.length / 2; if(chunkSize >= 1){ var left:Array = mergeSort(array.slice(0, chunkSize)); var right:Array = mergeSort(array.slice(chunkSize)); var result:Array = []; while(left.length && right.length){ if(left[0] < right[0]){ result.push(left.shift()); } else{ result.push(right.shift()); } } return result.concat(left, right); } return array; }
In fact, even such an implementation is faster than some of those found by me in all sorts of blogs.6 { _3_ [ 1 (1, 2) 2 (3, 4) ], five[ _4_ (5, 6) ] }But you can sort all subarrays from one element, and then merge them into subarrays of 4 elements.
6 { _four_[ 1 (1, 2) 2 (3, 4) ], five[ _3_ (5, 6) ] }
function mergeSort(array:Vector.<int>):Vector.<int> { var length:uint = array.length; var buffer:Vector.<int> = new Vector.<int>(length, true); for (var leftChunkSize:uint = 1; leftChunkSize < length; leftChunkSize *= 2) { // low var bufferPointer:uint = 0; var leftChunkStart:uint = 0; for (; leftChunkStart < length; leftChunkStart += leftChunkSize * 2) { // mid var rightChunkStart:uint = Math.min(leftChunkStart + leftChunkSize, length); var rightChunkEnd:uint = Math.min(rightChunkStart + leftChunkSize, length); var leftChunkEnd:uint = rightChunkStart; var leftPointer:uint = leftChunkStart; var rightPointer:uint = rightChunkStart; while (leftPointer < leftChunkEnd && rightPointer < rightChunkEnd) { // hard if (array[leftPointer] < array[rightPointer]) { buffer[bufferPointer++] = array[leftPointer++]; }else { buffer[bufferPointer++] = array[rightPointer++]; } } while (leftPointer < leftChunkEnd) { // hard buffer[bufferPointer++] = array[leftPointer++]; } while (rightPointer < rightChunkEnd) { // hard buffer[bufferPointer++] = array[rightPointer++]; } } var temp:Vector.<int> = array; array = buffer; buffer = temp; } if (result !== array) { for (var i:uint = 0; i < length; i++ ) { result[i] = array[i]; } } return result; }
In the comments indicated bottlenecks.FP | Pepperflash | |
200,000 items | ||
mergeSort | 160ms | 81ms |
Native sorting | 81ms | 90ms |
2,000,000 items | ||
mergeSort | 1800ms | 921ms |
Native sorting | 1378ms | 1425ms |
20,000,000 items | ||
mergeSort | 21374ms | 10267ms |
Native sorting | 20404ms | 21175ms |
function mergeSort(array:Vector.<int>, buffer:Vector.<int> = null):Vector.<int> { var length:uint = array.length; var result:Vector.<int> = array; buffer = buffer ? buffer : new Vector.<int>(length, true); for (var chunkSize:uint = 1; chunkSize < length; chunkSize <<= 1) { var bufferPointer:uint = 0; var leftChunkStart:uint = 0; for (; leftChunkStart < length; leftChunkStart += chunkSize << 1) { var rightChunkStart:uint = leftChunkStart + chunkSize; var rightChunkEnd:uint = rightChunkStart + chunkSize; if (length < rightChunkEnd) { rightChunkEnd = length; if (length < rightChunkStart) { rightChunkStart = length; } } var leftChunkEnd:uint = rightChunkStart; var leftPointer:uint = leftChunkStart; var rightPointer:uint = rightChunkStart; while (leftPointer - leftChunkEnd & rightPointer - rightChunkEnd) { if (array[leftPointer] < array[rightPointer]) { buffer[bufferPointer++] = array[leftPointer++]; }else { buffer[bufferPointer++] = array[rightPointer++]; } } while (leftPointer < leftChunkEnd) { buffer[bufferPointer++] = array[leftPointer++]; } while (rightPointer < rightChunkEnd) { buffer[bufferPointer++] = array[rightPointer++]; } } var temp:Vector.<int> = array; array = buffer; buffer = temp; } if (result !== array) { for (var i:uint = 0; i < length; i++ ) { result[i] = array[i]; } } return result; }
FP | Pepperflash | |
200,000 items | ||
mergeSort | 130ms | 64ms |
Native sorting | 81ms | 90ms |
2,000,000 items | ||
mergeSort | 1462ms | 730ms |
Native sorting | 1378ms | 1425ms |
20,000,000 items | ||
mergeSort | 16937ms | 8435ms |
Native sorting | 20404ms | 21175ms |
200 items and 1000 sorts | ||
mergeSort | 88ms | 38ms |
Native sorting | 70ms | 48ms |
Array creation with random elements | 36ms | 10ms |
2000 items and 10,000 sorts | ||
mergeSort | 10077ms | 4809ms |
Native sorting | 6885ms | 5912ms |
Array creation with random elements | 2178ms | 760ms |
Source: https://habr.com/ru/post/207784/
All Articles