二分查找,和快排。过几天比较下快排和插入排序,两个的效率。
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);
}
}
}
分享到:
相关推荐
教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
三、 专业面试对自己简历上不要为了蒙骗面试官,写的项目自己捡不熟悉,对简历上的东西一问三不知,语言表达不清楚,说不半天不能告诉面试官你做的工作内容和意义,这个很不好。 群面 一般10-14个人,看当天应聘的...
文章详细介绍了算法的设计思路和实施过程,强调了在不影响系统性能的前提下,如何从软件层面实现磁盘的节能。磁盘能耗的影响因素包括工作状态(读写)、睡眠和空闲等,工作状态下的磁头移动和盘片旋转是最主要的能耗...
- Gale-Shapley算法可以找到一个稳定的婚姻匹配。 - 在配对问题中有着重要应用。 16. **后缀数组**: - 用于高效地处理字符串的后缀。 - 在文本处理和模式匹配中非常重要。 17. **左偏树**: - 是一种自平衡...
通过分析用户在睡眠中的体动、声音变化等数据,可以推断出浅睡、深睡、REM(快速眼动)等不同睡眠阶段。Android提供了SensorManager类来管理和访问设备上的各种传感器,开发者需要注册监听器,实时获取并存储这些...
教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
**基于MSP430的FFT精简算法详解** ...文件"基于MSP430的FFT精简算法"应该包含了实现这一目标的具体步骤、源代码示例以及可能的性能测试结果,对于需要在MSP430上进行FFT运算的开发者来说,是一份宝贵的参考资料。
这表明文档是麻省理工学院(MIT)关于算法导论课程的一系列教学材料中的第一部分。MIT作为世界顶尖学府之一,在计算机科学领域享有极高的声誉,其课程资料往往包含了最前沿的研究成果和教育理念。 #### 描述分析:...
TI 阻抗跟踪技术是一种高精度的电池电量监测算法,旨在解决电池电量监测中的精度问题。该技术综合了基于库仑计数算法和电压相关算法的优点,能够实现 1% 的电池容量估计。 电池电量监测的重要性 在过去的几年里,...
SLIC(Simple Linear Iterative Clustering)超像素分割算法是一种广泛应用的图像分割技术,它将图像中的像素组织成较小的、具有相似颜色和纹理特征的区域,这些区域被称为超像素。MATLAB作为强大的数学计算和图像...
2. app.db-shm:这是SQLite数据库的共享内存文件,是数据库在进行写操作时的一种临时文件,用于提高并发性能。当数据库正在被多个进程或线程访问时,shm文件会帮助协调数据的读写。 3. app.db-wal:这是SQLite的...
在看到标题“jwlogin:睡不着,瞎写着玩”时,我们可以推测这可能是一个个人项目,开发者在夜晚失眠时为了消磨时间而创建的一个登录系统。尽管标题略带轻松幽默的意味,但我们可以深入探讨一下Java中与登录相关的...
参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者...
在"一种写数据和一种读数据的方法和装置.pdf"这份文档中,可能会详细阐述上述某一种或多种技术的具体实现,包括算法设计、硬件接口优化、软件架构等方面。通过深入学习这份文档,读者可以了解到如何根据实际应用场景...
首先,C++是一种面向对象的编程语言,因此在这个系统中,对象扮演着重要的角色。我们可以定义一个`Animal`基类,包含属性如种类、年龄、性别等,以及行为如吃食、睡觉等方法。通过继承`Animal`,可以创建不同类型的...
这个名为"DBN_MNIST_Generating"的项目是针对MNIST手写数字数据集的一个实例,它利用DBN的唤醒睡眠算法来训练模型,并基于标签生成新的数据。 首先,让我们深入了解DBN的结构和工作原理。DBN是由多个无监督的RBM层...
整套代码写的较为简洁,而且有添加相应的注释,因此进行分享,而且不仅仅说是睡眠分期,也可以作为学习如何使用神经网络去进行**时序数据分类**问题的一个入门项目,包括怎么用GRU、LSTM和Attention这些经典网络结构...
醒睡算法是一种用于无监督学习的方法,旨在通过正向传播和反向传播的过程来优化网络参数,以实现对输入数据的准确建模。在深度信念网络中,对比版本的醒睡算法能够更有效地更新参数,从而改善模型的性能。 #### ...
以前写的,用来延时关机。 费功夫的不是写代码而是画图标。