一、插入排序

1.算法思想

要求在一个已经有序的数据序列中插入一个数据,并且插入次数据后数据序列依然有序,这时就需要用到一种新的排序方法——插入排序,其基本思想就是每步讲一个待排序的记录,按其关键码值的大小插入到前面已经排序的文件中适当的位置,直至全部插入完为止。

2.具体步骤

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果已排序的元素大于新元素,将其移到下一位置
  4. 重复步骤3,直至找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入
  6. 重复步骤2-5

3.算法复杂度

时间复杂度:如果将n个元素升序排列,最好的情况是已经升序,这种情况下,只需要进行(n-1)此比较即可;最坏的情况是降序排列,此时需要比较n(n-1)/2次。平均时间复杂度为o(n^2)。

空间复杂度:o(1)

稳定性:在插入过程中,如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,是稳定的。

void InsertSort(int* arr,size_t size)
{
	if (NULL == arr || size == 1)
		return;
	for (size_t i = 1; i < size; i++)
	{
		int key = arr[i];
		int end = i - 1;
		while (key < arr[end] && end >= 0)
		{
			arr[end + 1] = arr[end];
			end--;
		}
		arr[end + 1] = key;
	}
}

在插入数据过程中,比较次数可能会比较多,我们可以将直接查找的方改为折半查找,即可得到折半插入排序算法,相比于直接插入排序,有一定的优化。

void InsertSort_B(int* arr,size_t size)
{
	if (NULL == arr || size == 1)
		return;
	for (size_t i = 1; i < size; i++)
	{
		int key = arr[i];
		int left = 0;
		int right = i - 1;
		int end = i - 1;
		while (left <= right)
		{
			int mid = left + ((right - left) >> 1);
			if (key < arr[mid])
				right = mid - 1;
			else
				left = mid + 1;
		}
		while (left <= end)
		{
			arr[end + 1] = arr[end];
			end--;
		}
		arr[end + 1] = key;
	}
}

二、希尔排序

1.算法思想

希尔排序又称缩小增量法,是直接插入排序的一种改进。其基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 dt=1,即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入的方法。

2.具体步骤

假设有10个记录,其关键字分别是:7,5,3,1,9,4,6,2,8;取增量依次为3,1


3.算法分析

希尔排序不需要大量的辅助空间,容易实现。相比于插入排序,效率上有所提高,其时间复杂度也有增量的选取有关。希尔排序没有快速排序快,对于规模非常大的数据排序不是最优的选择;但是希尔排序在最坏的情况下和平均情况下执行效率相差不是很大,快速排序则相差较大,因此,几乎任何排序工作在开始时都可以用希尔排序,若在实际中证明它不够快,再改成快速排序。此外,希尔排序是不稳定的。

void shellsort(int* arr,size_t size)
{
	int gap = size;
	while (gap > 1)
	{
		gap = gap / 4 + 1;
		for (size_t i = gap; i < size; i++)
		{
			int key = arr[i];
			int end = i - gap;
			while (key < arr[end] && end >= 0)
			{
				arr[end + gap] = arr[end];
				end -= gap;
			}
			arr[end + gap] = key;
		}
	}
}

【数据结构】排序算法——插入排序和希尔排序的更多相关文章

  1. ios – 按键键入字典的Swift排序数组,其中value是可选的AnyObject

    我正在直接从Parse中提取一系列字典并将它们显示在表格中.所以我真的很想处理我所掌握的数据结构.PFObject是[String:AnyObject?解决方法Swift无法比较任何两个对象.您必须先将它们转换为特定类型:如果有多个字典没有指定键的值,它们将被放置在结果数组的末尾,但它们的相对顺序是不确定的.

  2. swift篇第一期:简单的数据结构

    首先我们可以去使用Playground来编码,并且会实时的显示对应的编码信息,这样我们就不用每次都去运行程序来显示输出的东西了哦,也方便了我们对某些语句的验证,这个是比较赞的var与let前者为可变修饰符,后者为不可变从字面意思我们就可以很好的区分了常用的类型呢,跟其他语言基本相同啦,主要有几种:1.int类型2.Float,Double类型3.String类型4.Boolean类型当我们去声明一

  3. swift实现排序算法

    swift实现排序算法swift插入排序funcinsertionSort(){varx,y,key:Intfor(x=0;x-1;y--){if(key

  4. Swift 集合数据结构性能分析

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. Swift中的集合类数据结构

    在那种情况下,你将会需要一种基本的集合类数据结构。继续学习,你将会比较成熟的Cocoa数据结构与对应的纯Swift结构的性能。常见iOS数据结构iOS中三种最常用的数据结构是arrays,dictionaries和sets。除了在Swift和Objective-C中旧的Foundation框架中的数据结构,现在又有了新的仅支持Swift版本的数据结构与语言紧密结合在一起。Swift数组是同质的,意味着每一个Swift数组都只包含一种类型的对象。

  6. Swift 闭包排序算法

  7. 11.Swift 中的类和结构体

    举例来说,以下情境中适合使用结构体:1.几何形状的大小,封装一个width属性和height属性,两者均为Double类型。这次就讲到这里,下次我们继续

  8. 通过算法了解Swift 3—插入排序

    Insertionsort源自泊学IOS技法学习插入排序是最基础的排序算法之一。在理解插入排序的时候,要时刻记住一件事情:元素的操作永远只发生在相邻的两个元素之间。不用交换元素的插入排序方法除了使用remove&insert或swap之外,还有一种插入排序的手段。

  9. Swift 归并排序

    用Swift写的一个归并排序算法(递归法)从小到大排列。

  10. a place you can learn algorithms and data structures(算法和数据结构) in swift

    https://github.com/raywenderlich/swift-algorithm-club

随机推荐

  1. 【数据结构】

    非线性结构:线性结构的元素之间具有线性关系,非线性结构中的元素之间不再是序列的关系,他们呈现的是更复杂的层次关系,即一个数据元素有且仅有一个直接前驱,但可有另个或者多个直接后继,显然比序列关系复杂常见非线性结构:树,图散列表PHP中的hashtable就是哈希表就是由数组和链表组成,一个长度为16的数组中,每个元素存储的是一个链表的头结点。

  2. 伸展树(SPLAY)个人总结+模板 [平衡树]【数据结构】【模板】

    前言最近3个月内,无论是现场赛还线上赛中SPLAY出现的概率大的惊人啊啊啊!!!然而不会的我就GG了,同时发现大家都会SPLAY,,,,然后就学习了一波。——————————————————————————-附上整体代码-md贴上来太卡了,去题解里看吧维护序列的维护一堆数的

  3. BZOJ 1895 &amp; POJ 3580 supermemo [SPLAY]【数据结构】

    Ay}Ttimes.Forexample,performing“REVOLVE242”on{1,5}INSERTxP:insertPafterAx.Forexample,performing“INSERT24”on{1,5}DELETEx:deleteAx.Forexample,performing“DELETE2”on{1,5}MINxy:querytheparticipantwhatistheminimumnumberinsub-sequence{Ax…Ay}.Forexample,thecorrec

  4. 【数据结构】单调栈

    显然,每个发射站发来的能量有可能被0或1或2个其他发射站所接受,特别是为了安全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计算出接收最多能量的发射站接收的能量是多少。输入输出格式输入格式:第1行:一个整数N;第2到N+1行:第i+1行有两个整数Hi和Vi,表示第i个人发射站的高度和发射的能量值。输入输出样例输入样例:34235610输出样例:7题解中有讲解代码实现

  5. 陈越《数据结构》第三讲 树上

    -这个集合可以为空;-若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。特殊二叉树二叉树的性质二叉树的存储结构顺序存储;链式存储在此处再次说一说:typedefstructPloyNode*polynomial;//这句有什么用呢?你可以用polyNode来代表整个结构体变量。

  6. 陈越《数据结构》第二章 线性结构

    表中元素个数称为线性表的长度;线性表没有元素时,称为空表;表起始位置称表头,表结束位置称表尾。插入和删除操作只能在链栈的栈顶进行。

  7. 陈越《数据结构》第一讲 基本概念

    陈越《数据结构》第一讲基本概念1什么是数据结构1.1引子例子:如何在书架上摆放图书?数据结构是:1.数据对象在计算机中的组织方式;2.数据对象必定与一系列加在其上的操作相关联;3.完成这些操作所用的方法就是算法。抽象数据类型数据类型-数据对象集;-数据集合相关联的操作集。抽象-与存放数据的机器无关;-与数据存储的物理结构无关;-与实现操作的算法和编程语言均无关。

  8. 【数据结构】 堆

    自底向上://增加/减少已有节点值Heap_Increase_Key//向堆插入新的节点HeapInsert自顶向下://替换堆顶后,维持堆函数KeepHeap//弹出堆顶函数Pop

  9. 【数据结构】【C++STL】FIFO队列&amp;优先队列

    首先都需要打头文件queueFIFO队列是先进先出的就好像排队一样STL定义FIFO队列优先队列的话是有优先级存在的STL定义优先队列定义方式都是大根堆FIFO队列和优先队列都有一些操作COYG

  10. BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】

    有长为N的数列,不妨设为a1,a2,…Input第一行两个整数N和P。第二行含有N个非负整数,从左到右依次为a1,aN,。表示把所有满足t≤i≤g的ai改为ai×c。操作2:“2tgc”。同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。Output对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。SampleInput7431234567512553242379313347SampleOutput2358HINT初始时数列为。对第5次操作,和为29+34+15+16=

返回
顶部