记录我学习数据结构之路(七)

直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

这是书上写的操作,他是把数组的第一个位置空出来,从第二个位置开始开始放入数据,那么空出来的第一个位置就是用来暂时存放取出来的数值的。从数组的第三个位置开始取,取出来之后向前遍历,如果前一个值比它大,那么前一个人往后移动一位,直到找到不比取出来的数值大的,然后就把取出来的值插入那个值后面。

我就不用数组的第一个值作存放取出值了,数组从0位开始存,另外再声明了一个变量来存放取出来的值:

public void sort(){
		int out,in;
		for(out = 1; out < nElement; out++){
			long temp = a[out];
			in = out;
			while(in > 0 && a[in-1] > temp){
				a[in] = a[in-1];
				in--;
			}
			a[in] = temp;
		}
	}

直接插入排序中只多了一个辅助变量的空间,主要是看时间时间复杂度。

当最好的情况,也就是要排序的表本身就是有序的,只是比较没有任何的移动,时间复杂度为0。当最坏的情况,即待排序表是逆序的情况,此时需要比较2+3+...+(n+2)(n-1)/2次,而记录的次数也达到了最大值(n+4)(n-1)/2次。如果排序是随机的,那么根据概率相同的原则,平均比较和移动次数约为n^2/4次。

因此,直接插入排序法的时间复杂度为O(n^2)。虽然跟冒泡法和选择排序的时间复杂度是一样的,但直接插入排序比他们俩的效率要高。

时间: 2024-10-11 16:18:02

记录我学习数据结构之路(七)的相关文章

记录我学习数据结构之路(二)

算法的定义:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 算法的特性:输入.输出.有穷性.确定性和可行性.输入和输出:算法具有零个或多个输入和输出.有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成.确定性:算法的每一步骤都具有确定的含义,不会出现二义性.可行性:算法的每一步都必须的可行的,也就是说,每一步都能通过执行有限次数完成. 算法的设计要求:1.正确性:算法至少应该有输入.输出和加工处理无歧义性

记录我学习数据结构之路(八)

线性表的顺序存储的缺点就是插入和删除的时候需要移动大量的数据,这是非常耗时间的.那应该换一种思路,在第一个元素的时候,就知道第二个元素的位置:在第二个的时候就找到了第三个的位置,以此类推.这样,只要记录下下一个的位置了,不管数据存在哪里,都能顺利地找到下一个结点的位置. 代码实现: /***  * 单链表节点类  * @author link  *  */ public class Node { public int iNum; public double dNum; public Node n

记录我学习数据结构之路(四)

首先写一个数组类(这个是按照从小到大排列的数组).插入操作:遍历整个数组,当找到该数据比要插入的数据后就跳出循环,然后从最后一个数据向前遍历,直到遍历到刚刚找到的那个数据项为止,每个数据往后移动一位,最后就往找到的那个位置插入该数值.删除操作:遍历数组,找到要删除的数据项,删除.查找操作:用二分查找法,每次都找到数据中间的一项,如果该项比要查找的数据大,那么把后一般的数据去掉,保留前一半的数据,然后再找前一半数据的中间项,重复这个方法直到找到为止. public class OrderArray

记录我学习数据结构之路(六)

选择排序思路:不像冒泡排序那样每次找到比它小的就交换,而是要选择最小的,只交换一次就够了. 代码实现如下: public void sort(){ int out,in,min; for(out = 0; out < nElement; out++){ min = out; for(in = out+1; in < nElement; in++){ if(a[in] < a[min]){ min = in; } } swap(out,min); } } 选择排序最大的特点就是交换移动数据

记录我学习数据结构之路(九)

双端链表跟传统的单链表不同的地方是,单链表就只有一个first指向头结点的,而双端链表不仅有first指向头结点,而且有一个last指向尾结点. 代码展示: public class Node { public int iNum; public double dNum; public Node next;   //指向下一个结点 public Node(int i,double d){ iNum = i; dNum = d; } public void show(){ System.out.pr

20172314 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172314 2017-2018-2 <程序设计与数据结构>第七周学习总结 教材学习内容总结 创建子类: 继承就是从现有类派生新类的过程,通过在子类的声明头中写public class 子类名 extends 父类名;来实现. 特别注意: 子类的实例化并不依赖于父类的实例化. 继承具有单向性,父类不能引用子类中声明的变量和方法. 构造方法不会继承. protected修饰符: 父类中的公共方法可以在子类中通过名称访问,若子类想访问其私有方法,那么父类的方法就必须声明为protected可见

20172313 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172313 2017-2018-2 <程序设计与数据结构>第七周学习总结 教材学习内容总结 学习了如何去创建一个子类. 学习了使用protected修饰符让子类能够访问一个父类公共变量和使用保留字super来调用父类的构造方法. 学习了如何对父类的方法进行重写. 初步学习了类层次结构,了解了Object类和抽象类以及接口的层次结构. 学习了子类怎样通过一个其他方法来引用父类中的方法和变量以及常量. 初步学习了类间继承关系的设计. 教材学习中的问题和解决过程 问题1:在学习接口的时候就有这

20172324 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172324 2017-2018-2 <程序设计与数据结构>第七周学习总结 教材学习内容总结 编写类是定义一组类似的对象:类建立了对象的特征和行为,但没有位声明的变量预留内存空间(除非所声明的变量是静态的) 继承是从现有类派生新类的过程,并且是一种强有力的软件开发技术. super可用来访问构造方法.父类的构造方法不能直接按名字调用,但可用super引用调用父类的构造方法. 当子类和父类有相同的方法名时,子类方法将重写父类方法,子类方法优先.但是子类不能重写final方法. 子类不可以重写

20172328 2018-2019《Java软件结构与数据结构》第七周学习总结

20172328 2018-2019<Java软件结构与数据结构>第七周学习总结 概述 Generalization 本周学习了第11章:二叉查找树.在本章中,主要探讨了二叉查找树的概念和各种二叉查找树实现,考察为二叉查找树添加和删除元素的算法以及维护平衡二叉查找树的算法 教材学习内容总结 A summary of textbook 二叉查找树(binary search tree):二叉树定义的扩展,一种带有附加属性的二叉树.附加属性是什么?树中的每个节点,其左孩子都要小于其父节点,而父节点