Структура данных: общий алгоритм сортировки (3): сортировка двоичной вставкой
Сортировка вставки:
1. Идея: на каждом этапе сортируемая запись вставляется в соответствующую позицию ранее отсортированной последовательности слов в соответствии с размером кода последовательности, пока все вставки не будут отсортированы.
2. Ключевой вопрос: найти подходящую позицию вставки в ранее отсортированной последовательности.
Метод: в прямую вставку рода , бинарная сортировке вставки , Шелл
Сортировка двоичной вставкой
1. Основная идея:
Основная идея: идея сортировки вставкой дихотомии такая же, как и у прямой вставки, за исключением того, что способ поиска подходящей позиции вставки отличается. Здесь нужно найти подходящую позицию путем дихотомии, что может уменьшить количество сравнений.
Сортировка двоичной вставкой, называемая двоичной сортировкой, - это когда вставляется i-й элемент, предыдущие элементы 0 ~ i-1 делятся пополам и сначала сравнивается элемент в середине. Если он меньше, первая половина делится вдвое, в противном случае Вторая половина делится пополам, пока left <right, а затем все элементы между первой позицией i-го элемента и целевой позицией перемещаются назад, а i-й элемент помещается в целевую позицию.
Согласно идее двоичного поиска, проверяемые записи делятся на упорядоченный список и неупорядоченный список, и каждый раз первое ключевое слово неупорядоченного списка сравнивается с записью в середине упорядоченного списка. Если он меньше записи, вставьте элемент в следующую подтаблицу, в противном случае, если он больше, чем запись, вставьте элемент в предыдущую подтаблицу. Повторяйте несколько раз, пока все записи не будут вставлены в таблицу.
2. Пример
Сортировка массива a [6] = {5,36,24,10,6,12} сортировкой двоичной вставкой
Источник изображения: https://www.cnblogs.com/zwtgyh/p/10631760.html
Код
#include<iostream>
using namespace std;
/*二分查找函数,返回插入下标*/
template <typename T>
int BinarySearch(T array[], int start, int end, T k)
{
while (start <= end)
{
int middle = (start + end) / 2;
int middleData = array[middle];
if (middleData > k)
{
end = middle - 1;
}
else
start = middle + 1;
}
return start;
}
//二叉查找插入排序
template <typename T>
void InsertSort(T array[], int length)
{
if (array == nullptr || length < 0)
return;
int i, j;
for (i = 1; i < length; i++)
{
if (array[i]<array[i - 1])
{
int temp = array[i];
int insertIndex = BinarySearch(array, 0, i, array[i]);//使用二分查找在有序序列中进行查找,获取插入下标
for (j = i - 1; j >= insertIndex; j--) //移动元素
{
array[j + 1] = array[j];
}
array[insertIndex] = temp; //插入元素
}
}
}
//主函数
int main() {
//int *a = Random();
int a[6] = { 5, 36, 24, 10, 6, 12 };
InsertSort(a, 6);
for (int i = 0; i < 6; i++)
{cout << a[i] << " ";}
cout << endl;
return 0;
}
3. Резюме:
1. Резюме: худший случай: каждый раз, когда он вставляется в начало упорядоченной последовательности, элементы всей упорядоченной последовательности необходимо перемещать назад, а временная сложность составляет O (n2).
2. Наилучший случай: массив, который нужно отсортировать, находится в положительном порядке, а позиция каждого элемента - это позиция его вставки. В настоящее время временная сложность - это только сравнение. 3. Временная сложность составляет O (log2n)
4. Средняя ситуация: O (n2)
С точки зрения пространственной сложности двоичная вставка также сортируется на месте, а пространственная сложность составляет (O (1)).