`
lzj0470
  • 浏览: 1277263 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用二分比较法,快速找到元素插入位置

阅读更多
package Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

	private int getBisearchElement(double dou[],int size){
		if(size==0){
			size = dou.length;
		}
		if(size==1){
			return 0;
		}
		return size/2;
	}
	
	private double getDouble() throws IOException{
		InputStreamReader reader = new InputStreamReader(System.in);
		BufferedReader input = new BufferedReader(reader);
		String s = input.readLine();
		return Double.parseDouble(s);
	}
	
	/**
	 * 比如:
	 * d1=0.12951463 d2=0.08425 1
	 * d1=0.12951463 d2=0.2516 -1
	 */
	private int compare(double d1,double d2){
		return Double.compare(d1, d2);
	}
	
	private double getDoubleElement(double dou1[],int size){
		return dou1[size];
	}
	
	/**
	 * 作用:利用二分比较法,快速找到元素插入位置
	 * 参数:dou1 数组;d2 插入元素;startlocation 前次数组endlocation下标;endlocation 数组endlocation下标
	 * 具体说明:第一步:判断两个Double元素哪个比较大,结果为1或者-1.
	 * 首先分析结果为1的情况:
	 *    无非就是挨靠与无挨靠的问题.举例说明数组[0.05550627,0.065414764,0.07849772...],0.05550627,0.065414764
	 *    是挨靠,0.05550627和0.065414764是无挨靠.概念清楚了,那么根据什么知道它们有无挨靠?依据就是形参startlocation
	 *    和endlocation.如果是无挨靠,那么就要进行如下公式:当前数组(endlocation)下标-前次数组(endlocation)下标=插入元素
	 *    适合的范围;插入元素适合的范围/2=从适合的范围的中间开始.
	 */
	private int compare(double dou1[],double d2,int startlocation,int endlocation){			
		int size = 0;
		double d1 = getDoubleElement(dou1,endlocation);
		int icomparser = compare(d1, d2);
		if(icomparser==1){//d1大,d2属于左边  第一步
			if(startlocation==endlocation-1){//它们俩是压着
				if(startlocation==0){
					if(compare(getDoubleElement(dou1,startlocation), d2)==1){
						size = 0;
					}else{
						size = 1;
					}
				}else{
					size = endlocation;
				}
				this.startlocation = endlocation;
			}else{
				int newsize = endlocation - startlocation;
				newsize = newsize/2;
				size = newsize + startlocation;
			}
		}else if(icomparser==-1){//d1小,d2属于右边 第一步
			int newsize = dou1.length-endlocation;
			if(newsize==1){//等于1,说明已经到了最后一个元素
				if(compare(getDoubleElement(dou1,endlocation), d2)==1){
					size = endlocation+1;
				}else{
					size = endlocation;
				}
			}else{
				newsize = newsize/2;
			}
			size = newsize + endlocation;
			this.startlocation = endlocation;
		}else if(icomparser==0){
			size = endlocation;
			this.startlocation = endlocation;
		}
		return size;
	}
	
	//插入位置
	public int location(Double d2) throws IOException{
		int dou1length = this.dou1length-1;	
		endlocation = getBisearchElement(dou1,0);
		while(endlocation<=dou1length){
			endlocation = compare(dou1 , d2 , startlocation , endlocation);	
			if(startlocation==endlocation||endlocation==0){
				break;
			}
		}
		return endlocation;
	}
	
	//插入指定的位置
	public void insertlocation(int location,double d1) throws Exception{
		if(location==dou1length){
			int i = size;
			int length = location-i;
			while(i>=2){
				dou1[length] = dou1[length+1];
				i--;
				length = location-i;
			}
			dou1[location-1] = d1;
			
		}else{
			int i = location;
			int length = location-i;
			int ilength = location-1;
			while(length!=ilength){
				dou1[length] = dou1[length+1];
				i--;
				length = location-i;
			}
			dou1[location-1] = d1;
		}
	}
	
	private static int startlocation = 0,endlocation = 0;
	private static int size = 6;
	private static double dou1[] = new double[size];
	
	private static int dou1length = 0;
	
	static{
		dou1length = dou1.length;
	}
	
	public static void main(String[] args) throws Exception {
		Test test = new Test();
		double d2 = test.getDouble();
		int location = test.location(d2);
		test.insertlocation(location, d2);
		startlocation = 0;
		endlocation = 0;
		d2 = test.getDouble();
		location = test.location(d2);
		test.insertlocation(location, d2);
		startlocation = 0;
		endlocation = 0;
		d2 = test.getDouble();
		location = test.location(d2);
		test.insertlocation(location, d2);
		startlocation = 0;
		endlocation = 0;
		d2 = test.getDouble();
		location = test.location(d2);
		test.insertlocation(location, d2);
		startlocation = 0;
		endlocation = 0;
		d2 = test.getDouble();
		location = test.location(d2);
		test.insertlocation(location, d2);
		startlocation = 0;
		endlocation = 0;
		for(int i=0;i<dou1length;i++){
			System.out.print(dou1[i]+",");
		}
	}

}

 

分享到:
评论

相关推荐

    常用算法 2分法插入排序

    2分法插入排序则在此基础上,利用二分查找来确定插入位置,它的步骤如下: 1. **初始化**:将数组分为已排序和未排序两部分,初始时,已排序部分只有一个元素,即数组的第一个元素。 2. **二分查找**:对于未排序...

    易语言二分插入排序

    而在二分插入排序中,我们利用二分查找的方法,在已排序的部分快速找到插入位置,显著减少了比较次数,尤其是在处理大量数据时,效率提升尤为明显。 二分插入排序的步骤如下: 1. 创建一个空的已排序区域,初始时,...

    折半插入法_折办插入法_

    折半插入法,又称二分插入排序(Binary Insertion Sort),是一种基于比较的排序算法,它利用了有序序列的特点,通过与中间元素对比来确定新元素的插入位置,从而提高排序效率。下面我们将详细讨论折半插入法的基本...

    易语言源码二分插入排序.rar

    1. **二分查找**:在插入元素时,不是线性地从头到尾寻找插入位置,而是利用二分查找法。首先,确定有序表的中间元素,然后根据待插入元素与中间元素的大小关系,缩小查找范围,再对剩余部分继续进行二分查找,直到...

    直接排序法,折半插入法,希尔排序法,快速排序法(c语言实现)

    折半插入排序是在插入排序的基础上优化的,它利用二分查找的方法降低插入元素时的比较次数。当需要将一个元素插入已排序的部分时,通过二分查找确定插入位置,减少了比较次数,提高了效率。其平均时间复杂度仍为O(n...

    二分法直接插入排序算法

    2. 二分查找法可以在O(logn)的时间内找到插入位置,大大减少了比较次数,尤其是在数据已经部分有序的情况下效率更高。 3. 找到插入位置后,依然需要将已排序部分的元素逐个后移,但因为插入位置通常比线性查找时更靠...

    易语言算法源码(二分直接插入排序)

    - 使用二分查找法在已排序部分中找到适当的插入位置。二分查找可以将查找时间复杂度从线性降低到对数级别。 - 一旦找到插入位置,就需要将该元素依次与已排序部分的后一个元素比较并交换,直到找到正确位置。 3. ...

    C++代码插入法

    它在寻找插入位置时使用二分查找,可以降低比较次数,但仍然保持O(n^2)的平均时间复杂度,只是常数因子变小了。 在实际编程中,插入排序常用于小规模数据或者部分有序的数据排序,因为它有较低的常数因子和良好的...

    二分查找法.pptx

    二分查找法,又称折半查找,是一种在有序数组中高效寻找特定元素的搜索算法。它的核心思想是通过不断地将待查找的区间减半来快速定位目标元素。以下是关于二分查找法的详细说明: 1. **使用前提**:二分查找法要求...

    数据结构 折半插入排序

    传统的插入排序通过顺序查找的方式确定元素应该插入的位置,而折半插入排序则利用二分查找技术来减少这一过程中的比较次数。 #### 折半插入排序算法原理 折半插入排序的核心思想是在插入排序的基础上,利用二分查找...

    C语言归并、选择、直接插入、希尔、冒泡、快速、堆排序与顺序、二分查找排序.rar

    C语言中常见的排序算法包括归并排序、选择排序、直接插入排序、希尔排序、冒泡排序、快速排序、堆排序以及顺序查找和二分查找。这些排序算法各有特点,在不同情况下有着不同的应用场景和性能表现。 归并排序(Merge...

    分治法实现二分搜索(c语言)

    在二分搜索中,我们把数组分为左、中、右三部分,每次将目标值与中间元素比较,根据比较结果缩小搜索范围,直到找到目标元素或确定目标元素不存在。 在C语言中实现二分搜索,我们需要定义一个函数来执行这个过程。...

    快速排序折半排序快速排序折半排序

    折半插入排序是在直接插入排序的基础上,利用二分查找来减少寻找插入位置的时间复杂度。对于每个待插入的元素,先通过二分查找确定其合适的插入位置,然后再进行插入。 #### 代码实现分析 在给定的代码中,`...

    冒泡 快速排序 选择排序 二分法 插入 快速选择

    6. **快速选择排序**:快速选择排序是快速排序的一个变种,它利用了快速排序的分治思想,但不需要完整地进行排序,只需要找到序列中的第k小(或第k大)的元素。快速选择排序的效率取决于选择基准元素的过程,通常...

    二分法排序和查找(C#)

    3. 将待插入元素插入到找到的位置,将后续元素向右移动一位。 4. 重复此过程,直到所有元素都插入到正确的位置。 在C#中,二分法排序和查找的性能分析如下: - 二分查找的时间复杂度为O(log n),空间复杂度为O(1)...

    希尔排序,直接插入排序,折半插入排序算法.

    它的核心思想是在插入新元素时,利用二分查找法快速确定插入位置,从而减少比较次数。二分查找的效率很高,但移动元素仍然需要线性时间。 #### 实现步骤 1. **初始化**:假定序列中的第一个元素已经排序。 2. **...

    数据结构 查找和排序的基本操作

    5. 二分插入排序是在直接插入排序基础上的优化,当处理大规模数据时,它先将元素分为已排序和未排序两部分,然后利用二分查找法确定新元素的插入位置,减少比较次数,提高了效率。 6. 快速排序是基于分治策略的排序...

    二分查找和hash表的实现

    二分查找,也称为折半查找,是一种在有序数组中查找特定元素的搜索算法。它的核心思想是通过比较目标值与数组中间元素的大小关系,不断缩小搜索范围。以下是二分查找的基本步骤: 1. 计算数组的中间索引。 2. 如果...

Global site tag (gtag.js) - Google Analytics