
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