Задача 9-3 учебника Введение в алгоритмы (CLRS) описывает быстрый Алгоритм O (n) для нахождения статистики k-го порядка (k-й элемент в массиве при сортировке) массива длины n для частного случая, когда k намного меньше, чем n. Я не уверен в правильности этого алгоритма, когда n нечетно, и хочу найти способ доказать его правильность.
Основная идея заключается в том, что сначала мы разделяем массив на две половины: первую с элементами floor(n/2), а вторую — с элементами ceil(n/2). Затем мы «сопоставляем» каждый элемент в первой половине с соответствующим элементом во второй половине. Когда n нечетно, остается оставшийся непарный элемент.
Для каждой пары партнеров мы убеждаемся, что левый партнер >= правый партнер, меняем их местами, если нет. Затем рекурсивно найдите статистику k-го порядка второй половины, отражающую любые свопы, сделанные во второй половине, с соответствующими свопами в первой половине. После этого статистика k-го порядка всего массива должна быть либо в первых k элементах первой половины, либо в первых k элементах второй половины.
Меня смущает случай, когда длина массива n нечетна, а во второй половине есть одинокий элемент, у которого нет партнера. Поскольку рекурсия выполняется на второй половине, состоящей из последних ceil(n/2) элементов массива, включая единственный последний элемент без партнера, и мы должны отразить все обмены, сделанные во второй половине, обменами, сделанными в соответствующем партнеров в первой половине, непонятно, что делать, когда в одном из обменов задействован финальный элемент, так как у него нет партнера.
Учебник, кажется, не уделяет особого внимания этому вопросу, поэтому я предполагаю, что когда обмен включает в себя последний элемент, то просто не делайте никаких зеркальных движений партнера в первой половине вообще. В результате последний элемент просто «крадет» партнера того, с кем его поменяли местами. Однако в этом случае есть ли простой способ убедиться, что алгоритм по-прежнему верен? Что если, когда последний элемент крадет чьего-то партнера, этот партнер на самом деле является статистикой k-го порядка и позже перемещается в недоступное место? Механика рекурсии и разбиения, включающая выборку по порядку статистики, для меня достаточно непрозрачна, поэтому я не могу с уверенностью исключить этот сценарий.