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

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

public class OrderArray {
	private long[] a;
	private int nElement;
	public OrderArray(int max){
		a = new long[max];
		nElement = 0;//注意这里不是max,因为一开始数组里面是没有实际数据的
	}

	public void insert(long value){
		int i;
		for(i = 0; i < nElement; i++){
			if(a[i]>value)break;
		}
		for(int k = nElement; k > i; k--){
			a[k] = a[k-1];
		}
		a[i] = value;
		nElement++;
	}

	public int size(){
		return nElement;
	}

	public void show(){
		for(int i = 0; i <nElement; i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}

	public int find(long searchKey){
		int minindex = 0;
		int maxindex = nElement-1;
		int middleindex;
		while(true){
			middleindex = (minindex+maxindex)/2;
			if(a[middleindex] == searchKey){
				return middleindex;
			}
			else if(minindex > maxindex){
				return nElement;
			}else{
				if(a[middleindex] < searchKey){
					minindex = middleindex + 1;//注意还要加1,不包括前一次的中项 
				}
				else{
					maxindex = middleindex - 1;
				}
			}
		}
	}

	public boolean delete(long value){
		int j = find(value);
		if(j == nElement){
			return false;
		}else{
			for(int k = j; k < nElement; k++){
				a[k] = a[k+1];
			}
			nElement--;
			return true;
		}
	}
}

测试类:

public class OrderArrayApp {
	public static void main(String[] args) {
		int max = 50;
		int searchKey = 66;
		OrderArrayCopy o = new OrderArrayCopy(max);
		o.insert(88);
		o.insert(11);
		o.insert(22);
		o.insert(33);
		o.insert(44);
		o.insert(55);
		o.insert(66);
		o.insert(77);
		o.insert(64);
		o.show();
		if(o.Find(searchKey)!=o.size())
		{
			System.out.print("Found:"+searchKey);
			System.out.println();
		}else{
			System.out.print("NotFound:"+searchKey);
			System.out.println();
		}
		o.delete(33);
		o.delete(98);
		o.show();
	}

}

测试结果:

11 22 33 44 55 64 66 77 88

Found:66

11 22 44 55 64 66 77 88

总结:这种顺序数组存储结构的优点是经过排序的,结构非常的清晰。缺点就是插入和删除都比较慢,因为插入或删除一个数据就要启动多个数据。二分查找:这种查找效率是很高的,数据越多的时候这种算法的效率就越高,每次都去除一半的数据,效率是非常的高,不像之前的查找方法要逐个遍历,比如有一百万个数据,每个数据都要比较一次,那是非常耗时间的。

时间: 2024-07-29 23:41:05

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

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

直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. 这是书上写的操作,他是把数组的第一个位置空出来,从第二个位置开始开始放入数据,那么空出来的第一个位置就是用来暂时存放取出来的数值的.从数组的第三个位置开始取,取出来之后向前遍历,如果前一个值比它大,那么前一个人往后移动一位,直到找到不比取出来的数值大的,然后就把取出来的值插入那个值后面. 我就不用数组的第一个值作存放取出值了,数组从0位开始存,另外再声明了一个变量来存放取出来的值: public

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

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

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

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

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

选择排序思路:不像冒泡排序那样每次找到比它小的就交换,而是要选择最小的,只交换一次就够了. 代码实现如下: 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

Redis学习——数据结构介绍(四)

一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合),相对于其他四种数据结构,Zset 是Redis独有的数据结构,作为有序的集合来使用还是十分方便的,下面我来介绍这集中数据结构: 数据类型 描述 set 无序.不重复的字符串集合 list 字符串链表 string 字符串.整型.浮点型 hash key和value都是无序的hashtable zs

学习之路四十一丶简论重构

四月份的最后一天,写点心得,记录一下. 这个月一直忙着开发一个基于Win32 API的程序,大量运用了句柄等很多API的知识. 尤其随着代码量越来越大,逻辑越来越复杂,代码的清晰,健壮,扩展性成了一个需要重视的问题,也就是要适时的重构了. 一丶重构的时机 上个星期在修改一块重大逻辑的时候,需要修改很多代码,当时我犯了一个错误,一开始想了一个思路,但一上来没写多少就开始想着重构代码,目的是使其代码清晰以及可扩展. 可是随着时间的流失,不仅没有重构好,而且该改的逻辑也没有改好,我很郁闷,为什么会这样

Redis——学习之路四(初识主从配置)

首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务器配置如下: 1.先找到配置redis.windows-service.config文件修改port 6379 为port 6380 2.然后配置master服务器地址:slaveof 127.0.0.1 6379,然后主服务有密码还需要配置密码 masterauth CeshiPassword(本

20145320《Java程序设计》第3周学习总结(第四章)

20145320<Java程序设计>第3周学习总结(第四章) 教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象 从对象看类:类的产生,是从少数实例,推广到大量相似实例的抽象化过程(abstraction) 类是对象的设计图,对象是类的实例,生成对象要先定义类 4.1 类与对象 定义类使用c