Структура данных: общий алгоритм сортировки (3): сортировка двоичной вставкой (реализация C ++)

Структура данных: общий алгоритм сортировки (3): сортировка двоичной вставкой

Сортировка вставки:

1. Идея: на каждом этапе сортируемая запись вставляется в соответствующую позицию ранее отсортированной последовательности слов в соответствии с размером кода последовательности, пока все вставки не будут отсортированы.
2. Ключевой вопрос: найти подходящую позицию вставки в ранее отсортированной последовательности.
Метод: в прямую вставку рода , бинарная сортировке вставки , Шелл

Сортировка двоичной вставкой

1. Основная идея:

Основная идея: идея сортировки вставкой дихотомии такая же, как и у прямой вставки, за исключением того, что способ поиска подходящей позиции вставки отличается. Здесь нужно найти подходящую позицию путем дихотомии, что может уменьшить количество сравнений.

Сортировка двоичной вставкой, называемая двоичной сортировкой, - это когда вставляется i-й элемент, предыдущие элементы 0 ~ i-1 делятся пополам и сначала сравнивается элемент в середине. Если он меньше, первая половина делится вдвое, в противном случае Вторая половина делится пополам, пока left <right, а затем все элементы между первой позицией i-го элемента и целевой позицией перемещаются назад, а i-й элемент помещается в целевую позицию.

Согласно идее двоичного поиска, проверяемые записи делятся на упорядоченный список и неупорядоченный список, и каждый раз первое ключевое слово неупорядоченного списка сравнивается с записью в середине упорядоченного списка. Если он меньше записи, вставьте элемент в следующую подтаблицу, в противном случае, если он больше, чем запись, вставьте элемент в предыдущую подтаблицу. Повторяйте несколько раз, пока все записи не будут вставлены в таблицу.

2. Пример

Сортировка массива a [6] = {5,36,24,10,6,12} сортировкой двоичной вставкой

img

Источник изображения: 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)).

рекомендация

отblog.csdn.net/qq_43801020/article/details/108108187
рекомендация