|
502 | 502 | // Проверяем, нужно ли активировать режим галопа |
503 | 503 | Если СчетчикПобедЛевый >= ПорогГалопа Тогда |
504 | 504 |
|
505 | | - // Галоп для левого массива - находим позицию в правом массиве |
506 | | - Позиция = ЭкспоненциальныйПоискВправо( |
507 | | - Массив, |
508 | | - ИндексПравого, |
509 | | - Конец2, |
510 | | - ЛевыйМассив[ИндексЛевого], |
511 | | - СравнениеЗначений |
512 | | - ); |
513 | | - |
514 | | - // Копируем элементы из правого массива |
515 | | - Пока ИндексПравого < Позиция Цикл |
516 | | - Массив[ИндексРезультата] = Массив[ИндексПравого]; |
517 | | - ИндексПравого = ИндексПравого + 1; |
518 | | - ИндексРезультата = ИндексРезультата + 1; |
519 | | - КонецЦикла; |
520 | | - |
521 | | - СчетчикПобедЛевый = 0; |
522 | | - СчетчикПобедПравый = 0; |
523 | | - |
524 | | - Продолжить; |
525 | | - |
526 | | - ИначеЕсли СчетчикПобедПравый >= ПорогГалопа Тогда |
527 | | - |
528 | | - // Галоп для правого массива - находим позицию в левом массиве |
| 505 | + // Левый массив побеждает - находим позицию в левом массиве |
| 506 | + // где элементы становятся >= текущему правому элементу |
529 | 507 | Позиция = ЭкспоненциальныйПоискВлево( |
530 | 508 | ЛевыйМассив, |
531 | 509 | ИндексЛевого, |
|
546 | 524 |
|
547 | 525 | Продолжить; |
548 | 526 |
|
549 | | - КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off |
550 | | - |
551 | | - // Обычное слияние |
552 | | - Если СравнениеЗначений.Выполнить(ЛевыйМассив[ИндексЛевого], Массив[ИндексПравого]) <= 0 Тогда |
| 527 | + ИначеЕсли СчетчикПобедПравый >= ПорогГалопа Тогда |
553 | 528 |
|
554 | | - Массив[ИндексРезультата] = ЛевыйМассив[ИндексЛевого]; |
555 | | - ИндексЛевого = ИндексЛевого + 1; |
556 | | - СчетчикПобедЛевый = СчетчикПобедЛевый + 1; |
557 | | - СчетчикПобедПравый = 0; |
| 529 | + // Правый массив побеждает - находим позицию в правом массиве |
| 530 | + // где элементы становятся >= текущему левому элементу |
| 531 | + Позиция = ЭкспоненциальныйПоискВправо( |
| 532 | + Массив, |
| 533 | + ИндексПравого, |
| 534 | + Конец2, |
| 535 | + ЛевыйМассив[ИндексЛевого], |
| 536 | + СравнениеЗначений |
| 537 | + ); |
558 | 538 |
|
559 | | - Иначе |
| 539 | + // Копируем элементы из правого массива |
| 540 | + Пока ИндексПравого < Позиция Цикл |
| 541 | + Массив[ИндексРезультата] = Массив[ИндексПравого]; |
| 542 | + ИндексПравого = ИндексПравого + 1; |
| 543 | + ИндексРезультата = ИндексРезультата + 1; |
| 544 | + КонецЦикла; |
560 | 545 |
|
561 | | - Массив[ИндексРезультата] = Массив[ИндексПравого]; |
562 | | - ИндексПравого = ИндексПравого + 1; |
563 | | - СчетчикПобедПравый = СчетчикПобедПравый + 1; |
564 | 546 | СчетчикПобедЛевый = 0; |
| 547 | + СчетчикПобедПравый = 0; |
565 | 548 |
|
566 | | - КонецЕсли; |
| 549 | + Продолжить; |
| 550 | + |
| 551 | + КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off |
567 | 552 |
|
568 | 553 | ИндексРезультата = ИндексРезультата + 1; |
569 | 554 |
|
|
610 | 595 |
|
611 | 596 | Функция ЭкспоненциальныйПоискВлево(Массив, Знач Начало, Знач Конец, Знач Значение, СравнениеЗначений) |
612 | 597 |
|
613 | | - Если СравнениеЗначений.Выполнить(Массив[Начало], Значение) <= 0 Тогда |
| 598 | + Если СравнениеЗначений.Выполнить(Массив[Начало], Значение) > 0 Тогда |
614 | 599 | Возврат Начало; |
615 | 600 | КонецЕсли; |
616 | 601 |
|
617 | | - Если СравнениеЗначений.Выполнить(Массив[Конец], Значение) > 0 Тогда |
| 602 | + Если СравнениеЗначений.Выполнить(Массив[Конец], Значение) <= 0 Тогда |
618 | 603 | Возврат Конец + 1; |
619 | 604 | КонецЕсли; |
620 | 605 |
|
|
0 commit comments