排序算法:折半插入排序

算法分析:

(1)时间复杂度

  从时间上比较,折半查找比顺序查找快,所以就平均性能来说,折半插入排序优于直接插入排序。

  折半插入排序所需要的关键字比较次数与待排序序列的初始排列无关,仅依赖于记录的个数。不论初始序列情况如何,在插入第i个记录时,需要经过logi+1(向下取整+1)次比较,才能确定它插入的位置。所以当记录的初始排列为正序或接近正序时,直接插入排序比折半插入排序执行的关键字比较次数要少。

  折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列。

  在平均情况下,折半插入排序仅减少了关键字的比较次数,而记录的移动次数不变。因此,折半插入排序的时间复杂度仍然为O(n^2)。

(2)空间复杂度

  折半插入排序所需附加存储空间和直接插入排序相同,只需要一个记录的辅助空间r[0],所以空间复杂度为O(1)

算法特点:

(1)是稳定排序。

(2)因为要进行折半插入查找,所以只能用于顺序结构,不能用于链式结构。

(3)适合初始记录无序、n较大的情况。

#include<iostream>
#include<vector>
using namespace std;
void BSort(int a[],int n)
{
	for (int i = 1; i < n; i++)//数组中的第一个元素最为已经排好的序列,所以从数组的第二个元素开始排
	{
		int key = a[i];//带插入元素
		int low = 0, high = i - 1;
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (key < a[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for (int j = i - 1; j >= high + 1; j--)
		{//i-1是已经排好序的序列的数量,high+1是待插入的的位置,元素后移腾出high+1这个位置
			a[j + 1] = a[j];
		}
		a[high + 1] = key;
	}
}
int main()
{
	int a [11] = { 2,6,4,5,54,53,53,5,34,34,32};
	BSort(a, 11);
	for (int i = 0; i < 11; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/wuyepeng/p/9690299.html

时间: 2024-10-08 05:49:20

排序算法:折半插入排序的相关文章

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

排序算法 之 插入排序

本次介绍排序算法中的插入排序. 1.直接插入排序: 基本思想: 直接插入排序也需要对待排序的序列在外层进行n-1次遍历,每次遍历时只把本次遍历次数处的元素和该元素之前的元素进行比较,来决定插入位置,并把从插入位置开始到该元素之前的所有元素后移,使从序列开始到该元素为止序列中的元素有序,直至遍历完成序列整体有序,插入排序算法的时间复杂度为O(n2): 如下表格所示为待排序的序列: 3 2 1 7 6 5 4 8 9 当进行第一次遍历时把元素e[1]和e[0]作比较,e[1]<e[0],所以e[1]

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较

#include <stdio.h> #include <time.h> #define N 100000 /*库比较函数:qsort(int *base,int n,int struct_size,int (*compare)(const void *,const void *))中的比较函数*/ int compare(const void *first, const void *second) { if (*(int *)first > *(int *)second)/

排序算法系列——插入排序

记录学习点滴,菜鸟成长记 接触算法是研究生期间做项目时,需要编写一些诸如GA.QGA的时候,第一次使用“排序”还是用的Java自带的Comparator接口.后来买了<算法导论>来看,发现果然所有知识都是有专业壁垒的,简单的一个问题尽然蕴藏着如此多的思想,发现此简直欣喜无比,遂决定要好好研究研究.只有深入后才发现,原来算法的不仅仅是按照逻辑顺序写个程序那么简单,好的算法要考虑到方方面面,最简单的时间复杂度就够我学习很长时间了. 将自己学习排序算法的一些理解和感悟记录于此,方便自己温故而知新.

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

排序算法之一插入排序

基本思想 每次将一个待排序的记录,按其关键字大小,插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 分类 根据寻找插入位置方法分为 直接插入排序 折半(二分)插入排序 希尔插入排序 直接插入排序 基本思想 当插入第i(i≥1)个对象时,前面的V[0],V[1],-,V[i?1]已经排好序.这时,用V[i]的排序码与V[i?1],V[i?2],-,V[0]的排序码顺序进行比较,找到插入位置即将V[i]插入,原来位置上的对象向后顺移. 直接插入排序图示 从上到下,分别展示了直接排

排序算法之插入排序(Java)

1.直接插入排序 <算法导论>P10,<数据结构>P265 向已经排好序的数组a[1..j-1]插入a[j],进行一趟循环遍历.插入排序的基本操作是在一个有序表进行查找和插入.每一趟插入排序从后往前进行比较,便于数组中元素的向后移动. 空间复杂度:O(1)(当使用swap交换时,可实现原址) 时间复杂度:(n^2)/4 即O(n^2) 2.拓展 1)折半查找排序 插入排序的基本操作是在一个有序表进行查找和插入.由查询故可以想到"二分查找"即折半查找,通过折半查找

排序之折半插入排序

排序思想: 1.每次插入,都从前面的有序子表中查找出待插入元素应该被插入的位置:  2.给插入位置腾出空间,将待插入元素复制到表中的插入位置. 注意到该算法中,总是边比较边移动元素,下面将比较和移动操作分离开来, 即先折半查找出元素的待插入位置,然后再统一地移动待插入位置之后的所有元素. public class BInsertSort { //折半插入排序 public static void BinaryInsertSort(int[] arr) { for(int i = 1;i<arr.

排序:折半插入排序(时间复杂度 O(nlog2 n) )

排序 Time Limit: 1000MS Memory limit: 32678K 题目描述 给你N(N<=100)个数,请你按照从小到大的顺序输出. 输入 输入数据第一行是一个正整数N,第二行有N个整数. 输出 输出一行,从小到大输出这N个数,中间用空格隔开. 示例输入 5 1 4 3 2 5 示例输出 1 2 3 4 5 #include <math.h> #include <string.h> #include <stdio.h> #include <