`
henry2009
  • 浏览: 93821 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

睡不着写算法(一)

    博客分类:
  • java
阅读更多

二分查找,和快排。过几天比较下快排和插入排序,两个的效率。

package algorithms;

/**
 * 快排,递归二分查找
 * @author henry
 * @date 2010-06-04  1:04:10
 */
public class RbSearch {

	public static int[] a = { 11, 22, 44, 5, 0, 3, 9, 10, 45 };

	/**
	 * 二分查找
	 * 
	 * @param left
	 * @param middle
	 * @param right
	 * @param searchkey
	 * @return
	 */
	public static boolean binarySearch(int left, int right, int searchkey, int[] arr) {
		
		if(left > right) {//如果左指针大于右指针位置
			return false;//返回false
		}
		
		int middle = (left + right) / 2;//取数组分割点下标
		
		if(searchkey > arr[middle]) {
			return binarySearch(middle + 1, right, searchkey, arr);
		}
		if(searchkey < arr[middle]) {
			return binarySearch(left, middle - 1, searchkey, arr);
		}
		if(searchkey == arr[middle]) {
			System.out.println("找到了!arr[" + middle + "]=" + searchkey);
			return true;
		}
		
		return false;
	}

	/**
	 * 快排2
	 * 这种方式是用数组的第一位数,作为数组分割点,然后分割排序
	 * 
	 * @param arr
	 * @param left
	 * @param right
	 */
	public static void quickSort2(int[] arr, int left, int right) {
		int povit,tmp;
		int i = left;
		int j = right;
		
		povit = arr[left];
		do {
			while(arr[i] < povit && i < right) {//找出比povit大的数
				i++;
			}
			
			while(arr[j] > povit && j > left) {//找出比povit小的数
				j--;
			}
			
			if(i < j) {//如果找出数值的位置下标符合条件,则两数组调换
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
			
		} while(i < j);
		
		if(i > j) {//如果左指针大于右指针,把分割数跟下标为j的调换数值
			tmp = arr[left];
			arr[left] = arr[j];
			arr[j] = tmp;
		}
		
		if(left < j)
			quickSort2(arr, left, j - 1);
		
		if(j < right)
			quickSort2(arr, j + 1, right);
	}
	
	/**
	 * 快速排序1
	 * 这种方式是第一步就取出给定数组的分割点进行排序
	 * 
	 * @param arr
	 */
	public static void quickSort(int[] arr, int left, int right) {
		int middle, tmp;
		int i = left;
		int j = right;
		
		middle = arr[(left + right)/2];
		
		do {
			while(arr[i] < middle && i < right) {//找出比middle大的数
				i++;
			}
			while(arr[j] > middle && j > left) {//找出比middle小的数
				j--;
			}
			
			if(i <= j) {//如果找出数值的位置下标符合条件,则两数组调换
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
				i++;//i下标右移
				j--;//j下标左移
			}
			
		} while (i < j);
		
		if(left < j) {
			quickSort(arr, left, j);
		}
		
		if(right > i) {
			quickSort(arr, i, right);
		}
	}

	public static void main(String[] args) {
		System.out.println("原序数组:");
		for (int k : a) {
			System.out.print(k + " ");
		}
		System.out.println();
		quickSort2(a, 0, a.length-1);
		
		System.out.println("排序后:");
		for (int k : a) {
			System.out.print(k + " ");
		}
		System.out.println();
		
		int searchKey = 45;//要查询的数字
		
		if(!binarySearch(0, a.length - 1, searchKey, a)) {
			System.out.println("查找不到对应数据:" + searchKey);
		}
	}
}
 
2
5
分享到:
评论

相关推荐

    进程线程之间的同步生产者消费者信号量读者写者写者优先

    教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    华为各轮面试总结 性能算法岗位

    三、 专业面试对自己简历上不要为了蒙骗面试官,写的项目自己捡不熟悉,对简历上的东西一问三不知,语言表达不清楚,说不半天不能告诉面试官你做的工作内容和意义,这个很不好。 群面 一般10-14个人,看当天应聘的...

    Linux下一种磁盘节能的预取算法.pdf

    文章详细介绍了算法的设计思路和实施过程,强调了在不影响系统性能的前提下,如何从软件层面实现磁盘的节能。磁盘能耗的影响因素包括工作状态(读写)、睡眠和空闲等,工作状态下的磁头移动和盘片旋转是最主要的能耗...

    ACM算法模板集史上最完整收藏版

    - Gale-Shapley算法可以找到一个稳定的婚姻匹配。 - 在配对问题中有着重要应用。 16. **后缀数组**: - 用于高效地处理字符串的后缀。 - 在文本处理和模式匹配中非常重要。 17. **左偏树**: - 是一种自平衡...

    睡眠分期图,使用Android写的一个图表

    通过分析用户在睡眠中的体动、声音变化等数据,可以推断出浅睡、深睡、REM(快速眼动)等不同睡眠阶段。Android提供了SensorManager类来管理和访问设备上的各种传感器,开发者需要注册监听器,实时获取并存储这些...

    操作系统实验二:进程、线程之间的同步

    教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    基于MSP430的FFT精简算法

    **基于MSP430的FFT精简算法详解** ...文件"基于MSP430的FFT精简算法"应该包含了实现这一目标的具体步骤、源代码示例以及可能的性能测试结果,对于需要在MSP430上进行FFT运算的开发者来说,是一份宝贵的参考资料。

    MIT算法导论教学PDF课件(1)

    这表明文档是麻省理工学院(MIT)关于算法导论课程的一系列教学材料中的第一部分。MIT作为世界顶尖学府之一,在计算机科学领域享有极高的声誉,其课程资料往往包含了最前沿的研究成果和教育理念。 #### 描述分析:...

    TI阻抗跟踪技术

    TI 阻抗跟踪技术是一种高精度的电池电量监测算法,旨在解决电池电量监测中的精度问题。该技术综合了基于库仑计数算法和电压相关算法的优点,能够实现 1% 的电池容量估计。 电池电量监测的重要性 在过去的几年里,...

    人工手写的MATLAB语言版的SLIC超像素分割算法,放心使用

    SLIC(Simple Linear Iterative Clustering)超像素分割算法是一种广泛应用的图像分割技术,它将图像中的像素组织成较小的、具有相似颜色和纹理特征的区域,这些区域被称为超像素。MATLAB作为强大的数学计算和图像...

    睡眠监测数据 2023-4.22~23

    2. app.db-shm:这是SQLite数据库的共享内存文件,是数据库在进行写操作时的一种临时文件,用于提高并发性能。当数据库正在被多个进程或线程访问时,shm文件会帮助协调数据的读写。 3. app.db-wal:这是SQLite的...

    jwlogin:睡不着,瞎写着玩

    在看到标题“jwlogin:睡不着,瞎写着玩”时,我们可以推测这可能是一个个人项目,开发者在夜晚失眠时为了消磨时间而创建的一个登录系统。尽管标题略带轻松幽默的意味,但我们可以深入探讨一下Java中与登录相关的...

    生产者消费者问题(信号量)(linux)实现代码

    参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者...

    行业分类-设备装置-一种写数据和一种读数据的方法和装置.zip

    在"一种写数据和一种读数据的方法和装置.pdf"这份文档中,可能会详细阐述上述某一种或多种技术的具体实现,包括算法设计、硬件接口优化、软件架构等方面。通过深入学习这份文档,读者可以了解到如何根据实际应用场景...

    写了一个动物园的管理系统,请大家多多指教

    首先,C++是一种面向对象的编程语言,因此在这个系统中,对象扮演着重要的角色。我们可以定义一个`Animal`基类,包含属性如种类、年龄、性别等,以及行为如吃食、睡觉等方法。通过继承`Animal`,可以创建不同类型的...

    dbnmatlab代码-DBN_MNIST_Generating:DBN的唤醒睡眠算法,并基于标签生成数据

    这个名为"DBN_MNIST_Generating"的项目是针对MNIST手写数字数据集的一个实例,它利用DBN的唤醒睡眠算法来训练模型,并基于标签生成新的数据。 首先,让我们深入了解DBN的结构和工作原理。DBN是由多个无监督的RBM层...

    基于单通道脑电信号的自动睡眠分期研究python源码+项目说明+模型+数据+示例图片.zip

    整套代码写的较为简洁,而且有添加相应的注释,因此进行分享,而且不仅仅说是睡眠分期,也可以作为学习如何使用神经网络去进行**时序数据分类**问题的一个入门项目,包括怎么用GRU、LSTM和Attention这些经典网络结构...

    A Fast Learning Algorithm for A Fast Learning Algorithm for Deep Belief Nets

    醒睡算法是一种用于无监督学习的方法,旨在通过正向传播和反向传播的过程来优化网络参数,以实现对输入数据的准确建模。在深度信念网络中,对比版本的醒睡算法能够更有效地更新参数,从而改善模型的性能。 #### ...

    兔子睡觉 -

    以前写的,用来延时关机。 费功夫的不是写代码而是画图标。

Global site tag (gtag.js) - Google Analytics