Учитывая массив из n элементов, где каждый элемент находится на расстоянии не более k от своей целевой позиции, разработайте алгоритм, который сортирует по времени O (n log k). Например, давайте рассмотрим k = 2, элемент с индексом 7 в отсортированном массиве, может быть с индексами 5, 6, 7, 8, 9 в данном массиве.
Примеры:
Input : arr[] = {6, 5, 3, 2, 8, 10, 9} k = 3 Output : arr[] = {2, 3, 5, 6, 8, 9, 10} Input : arr[] = {10, 9, 8, 7, 4, 70, 60, 50} k = 4 Output : arr[] = {4, 7, 8, 9, 10, 50, 60, 70}
Мы можем использовать сортировку вставками для эффективной сортировки элементов. Ниже приведен код C для стандартной сортировки вставок.
|
Джава
|
python3
|
C #
|
Внутренний цикл будет выполняться не более k раз. Чтобы переместить каждый элемент на правильное место, нужно переместить не более k элементов. Таким образом, общая сложность будет O (нк)
Мы можем сортировать такие массивы более эффективно с помощью структуры данных Heap . Ниже приводится подробный процесс, который использует кучу.
1) Создайте Min Heap размера k + 1 с первыми k + 1 элементами. Это займет O (K) время (см. Этот GFact )
2) Один за другим удалите элемент min из кучи, поместите его в массив результатов и добавьте новый элемент в кучу из оставшихся элементов.
Удаление элемента и добавление нового элемента в min heap займет время Logk. Таким образом, общая сложность будет O (k) + O ((nk) * logK)
|
Джава
|
python3
|
Выход:
Following is sorted array 2 3 6 8 12 56
Метод на основе Min Heap занимает время O (nLogk) и использует O (k) вспомогательное пространство.
Мы также можем использовать сбалансированное бинарное дерево поиска вместо кучи для хранения элементов K + 1. Операции вставки и удаления в Balanced BST также занимают время O (Logk). Таким образом, метод на основе сбалансированного BST также займет время O (nLogk), но метод на основе Heap кажется более эффективным, так как минимальный элемент всегда будет в корне. Кроме того, Heap не требует дополнительного места для левого и правого указателей.
Пожалуйста, пишите комментарии, если вы обнаружите, что какой-либо из приведенных выше кодов / алгоритмов неверен, или найдете другие способы решения той же проблемы.
Рекомендуемые посты:
- Сортировать почти отсортированный массив, используя STL
- Сортировать повернутый отсортированный массив
- Сортировать массив, когда две половинки отсортированы
- Сортировать почти отсортированный массив, в котором меняются только два элемента
- Сортировать массив, где подмассив отсортированного массива находится в обратном порядке.
- Вывести все элементы в отсортированном порядке из отсортированной по строке и столбцу матрицы
- heapq в Python для печати всех элементов в отсортированном порядке из отсортированной по строке и столбцу матрицы
- Tag Sort (чтобы отсортировать и оригинал)
- Merge K отсортировал двусвязный список в отсортированном порядке
- Максимальное количество разделов, которые можно отсортировать по отдельности, чтобы сделать сортировку
- С учетом связного списка, который отсортирован, как вы будете вставлять в отсортированном виде
- Сортировать связанный список, который уже отсортирован по абсолютным значениям
- Сортировать связанный список, который сортируется поочередно по возрастанию и по убыванию?
- Генерация всех возможных отсортированных массивов из альтернативных элементов двух заданных отсортированных массивов
- Учитывая отсортированный массив и число x, найдите пару в массиве, сумма которой ближе всего к x
0.00 (0%) 0 votes