当前位置: 首页 > news >正文

在最坏情况下,利用n + ┌lgn┐ - 2 次比较,即可找到 n 个元素中的第2小元素

/**
 * 与lg(n) 相关的排序算法,首先应该想到的是分治法,算法的思路如下:(为简单起见,不考虑取整的问题)
 * 利用折半比较,第一个与最后一个比较,然后第二个与倒数第二个比较,一直进行到中间,最坏情况就是n/2次.
 * 然后将每一对的较小元素放在 a[1...n/2] 数组中,较大的元素对应的放在 b[1...n/2]中.
 * 如果a的元素个数大于等于2,那么最小元素和次小元素一定在a数组中,再递归的在a中寻找第2小元素
 * 如果a的元素只有一个,则b中唯一的元素就是次小元素
 */
public class SecondMini {

	/**
	 * 利用折半比较,第一个与最后一个比较,然后第二个与倒数第二个比较,一直进行到中间,最坏情况就是n/2次.
	 * 然后将每一对的较小元素放在 a[1...n/2] 数组中,较大的元素对应的放在 b[1...n/2]中.
	 * 如果a的元素个数大于等于2,那么最小元素和次小元素一定在a数组中,再递归的在a中寻找第2小元素
	 * 如果a的元素只有一个,则b中唯一的元素就是次小元素
	 * @param arr
	 */
	static int secondMini(int arr[]){

		int a[] = new int[arr.length/2];
		int b[] =  new int[arr.length/2];
		for(int i = 0,j = arr.length-1;i<arr.length/2&&j>=arr.length/2;i++,j--){
			if(arr[i]<arr[j]){
				a[i] = arr[i];
				b[i] = arr[j];
			}else{
				a[i] = arr[j];
				b[i] = arr[i];
			}
		}
		//递归调用
		if(a.length>1)
			return secondMini(a);
		else{
			return b[0];
		}
	}
	public static void main(String[] args) {
		int arr[]  = {3,2,5,8,6,4,9,7};
		if(arr.length>=2){
			int result = secondMini(arr);
			System.out.println(result);
		}
	}
}


相关文章:

  • 牛客网上的剑指offer题目
  • 算法导论学习补充——希尔排序
  • java虚拟机学习笔记——java虚拟机内部体系概述(第五章)
  • java虚拟机学习笔记——java class文件的内容(第六章)
  • 《java jdk7学习笔记》之java三大平台
  • java类的装入
  • LR常用函数以及调用自定义函数
  • java类加载器体系结构
  • MySQL 导入数据
  • java虚拟机学习笔记——类型和对象的生命周期(第七章)
  • jQuery中的100个技巧(译)
  • 子类为什么不能重写父类的静态方法
  • 15.6.6 Configuring Thread Concurrency for InnoDB
  • java虚拟机学习笔记——连接模型(第八章)
  • JVM垃圾回收机制算法总结
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Git学习与使用心得(1)—— 初始化
  • javascript面向对象之创建对象
  • JS基础之数据类型、对象、原型、原型链、继承
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vim 折腾记
  • 程序员最讨厌的9句话,你可有补充?
  • 关于springcloud Gateway中的限流
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 马上搞懂 GeoJSON
  • 排序算法之--选择排序
  • 入手阿里云新服务器的部署NODE
  • 学习JavaScript数据结构与算法 — 树
  • Android开发者必备:推荐一款助力开发的开源APP
  • 回归生活:清理微信公众号
  • ​ssh免密码登录设置及问题总结
  • ​虚拟化系列介绍(十)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #if #elif #endif
  • (6)设计一个TimeMap
  • (剑指Offer)面试题34:丑数
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转)人的集合论——移山之道
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .apk文件,IIS不支持下载解决
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET gRPC 和RESTful简单对比
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net程序帮助文档制作
  • 。Net下Windows服务程序开发疑惑
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @EnableWebMvc介绍和使用详细demo
  • @NestedConfigurationProperty 注解用法
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell