рдмрд╛рдпрд╛рдБ - рдорд░реНрдЬрд╕реЙрд░реНрдЯ, рджрд╛рдпрд╛рдБ - рджреЗрд╢реА рдЫрдБрдЯрд╛рдИред рдкреЗрдкрд░рдлреНрд▓реИрд╢ рдФрд░ 75 рдорд┐рд▓рд┐рдпрди рдЖрдЗрдЯрдоред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреАрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдПрдХ рддрддреНрд╡ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдЖрджреЗрд╢рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдорд░реНрдЬ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рд╣реИред
рдорд░реНрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛ рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рдХрд╛рдЯрддреА рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрдирдкреБрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдЧреИрд░-рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЗ рдЕрд╡рд╢реЗрд╖реЛрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:
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; }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рд╕реЗ рднреА рддреЗрдЬ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдЧреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
рдкреБрдирд░рд╛рд╡рд░реНрддреА, рдкрд╣рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, 0 рдФрд░ 1, рдлрд┐рд░ 2 рдФрд░ 3, рдлрд┐рд░ 0..1 рдФрд░ 2..3 рдПрдХ рд╕рд░рдгреА 0..3 рдореЗрдВ рд╡рд┐рд▓рдп, рдФрд░ рдХреЗрд╡рд▓ 4 рдФрд░ 5 рдХреЗ рдмрд╛рджред
(рдЙрджреНрдШрд╛рдЯрди рдмреНрд░реИрдХреЗрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ)
6 {
_3_ [
1 (1, 2),
2 (3, 4)
]
5 [
_4_ (5, 6)
]
}
рд▓реЗрдХрд┐рди рдЖрдк рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рддрддреНрд╡ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ 4 рддрддреНрд╡реЛрдВ рдХреА рдЙрдк-рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
6 {
_4_ [
1 (1, 2),
2 (3, 4)
]
5 [
_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) {
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЕрдбрд╝рдЪрдиреЛрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИрдВред
рдкреАрд╕реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди: DDR3-1066 2GB, P6200 (2x2.13GHz)ред
("рдПрдлрдкреА" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ "FlashPlayerDebugger 11.9.900.170", рд░рд┐рд▓реАрдЬрд╝)
рдХрд╛рдо рдХреА рдЧрддрд┐ | рдПрдлрдкреА | PepperFlash |
200,000 рдЖрдЗрдЯрдо |
mergeSort | 160ms | 81ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 81ms | 90ms |
2,000,000 рдЖрдЗрдЯрдо |
mergeSort | 1800ms | 921ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 1378ms | 1425ms |
20,000,000 рдЖрдЗрдЯрдо |
mergeSort | 21374ms | 10267ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 20404ms | 21175ms |
рдЕрдм рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ:
- Math.min рд╕рд░рд▓ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред
- рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ 2 рд╕реЗ рдЧреБрдгрд╛ рдФрд░ рд╡рд┐рднрд╛рдЬрди рд╕реЗ рддреЗрдЬ рд╣реИред
- рдЖрдк рдЕрднреА рднреА рдпрд╛рдж рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ && рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
рдХреЛрдб 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; }
10 ^ 8 рддрддреНрд╡ рдореБрдЭ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 47 рд╕реЗрдХрдВрдб PepperFlash рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рдо рдХреА рдЧрддрд┐ | рдПрдлрдкреА | PepperFlash |
200,000 рдЖрдЗрдЯрдо |
mergeSort | 130ms | 64ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 81ms | 90ms |
2,000,000 рдЖрдЗрдЯрдо |
mergeSort | 1462ms | 730ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 1378ms | 1425ms |
20,000,000 рдЖрдЗрдЯрдо |
mergeSort | 16937ms | 8435ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 20404ms | 21175ms |
200 рддрддреНрд╡ рдФрд░ 1000 рдЫрдБрдЯрд╛рдИ |
mergeSort | 88ms | 38ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 70 рдПрдордПрд╕ рдЖрдкрд╛рддрдХрд╛рд▓реАрди | 48ms |
рдРрд░реЗ рд╕реГрдЬрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде | 36ms | 10ms |
2000 рддрддреНрд╡ рдФрд░ 10,000 рдкреНрд░рдХрд╛рд░ |
mergeSort | 10077ms | 4809ms |
рджреЗрд╢реА рдЫрдБрдЯрд╛рдИ | 6885ms | 5912ms |
рдРрд░реЗ рд╕реГрдЬрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде | 2178ms | 760ms |
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рддреЗрдЬ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2,000,000 рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 30% рддреЗрдЬ, рджреЛрдиреЛрдВ)ред
рдореВрд▓ рдЫрдВрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ n * 1.5 рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА, рдорд░реНрдЬрд╕реНрдЯреЙрд░реНрдЯ - рдмрд┐рд▓реНрдХреБрд▓ n рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдирддреАрдЬрддрди, рдПрдлрдкреА рдореЗрдВ рдЗрди рдЖрдВрджреЛрд▓рдиреЛрдВ рд╕реЗ рд▓рд╛рдн рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди PepperFlash рдореЗрдВ рдЖрдк рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓рдЧрднрдЧ рджреЛ рдХрдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред