当前位置: 首页 > 编程笔记 >

Android中关于递归和二分法的算法实例代码

罗安和
2023-03-14
本文向大家介绍Android中关于递归和二分法的算法实例代码,包括了Android中关于递归和二分法的算法实例代码的使用技巧和注意事项,需要的朋友参考一下

// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1。

package demo;
public class Mytest {
public static void main(String[] args) {
int[] arr={1,2,5,9,11,45};
int index=findIndext(arr,0,arr.length-1,12);
System.out.println("index="+index);
}
// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1。
public static int findIndext(int[] arr,int left,int right,int abc){
if(arr==null||arr.length==0){
return -1;
}
if(left==right){
if(arr[left]!=abc){
return -1;
}
}
int mid=left+(right-left)/2;//3//4
if(arr[mid]>abc){//
right=mid-1;
return findIndext(arr,left,right,abc);
}else if(arr[mid]<abc){//5<45//9<45/11<45
left=mid+1;
return findIndext(arr,left,right,abc);//2,5//3,5//4.5
}else{
return mid;
}
}
}
/ 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1。
// array 升虚数组
public int find(int[] array, int n){
if(array == null){
return -1;
}
int len = array.length;
if(n < array[0] || n > array[len-1]){
return -1;
}
int left = 0;
int right = len -1;
while(left < right){
int mid = left + (right - left) / 2;
if(array[mid] == n){
return mid;
}else if(array[mid] < n){
left = mid + 1;
}else{
right = mid - 1;
}
}
if (array[left] == n){
return left;
} else {
return right;
}
}
// 2. 写一个函数将一个数组转化为一个链表。
// 要求:不要使用库函数,(如 List 等)
public static class Node{
Node next;
int data;
}
// 返回链表头
public Node convert(int[] array){
if(array == null || array.length == 0){
return null;
}
Node head = new Node();
head.data = array[0];
int len = array.length;
Node end = head;
for(int i=1; i< len ; i++){
end = addNode(end, array[i]);
}
return head;
}
// 给链表尾部添加一个节点
public Node addNode(Node end, int data){
Node node = new Node();
node.data = data;
end.next = node;
return node;
}
// 3. 有两个数组,[1,3,4,5,7,9] 和 [2,3,4,5,6,8],用上面的函数生成两个链表 linkA 和
// linkB,再将这两个链表合并成一个链表,结果为[1,2,3,4,5,6,7,8,9].
// 要求:不要生成第三个链表,不要生成新的节点。
// 3.1 使用递归方式实现
// 
public Node comb(int[] arrayA, int[] arrayB){
Node linkA = convert(arrayA);
Node linkB = convert(arrayB);
Node head;
if(linkA.data == linkB.data){
head = linkA;
linkA = linkA.next;
linkB = linkB.next;
head.next = null;
}else if (linkA.data < linkB.data){
head = linkA;
linkA = linkA.next;
head.next = null;
}else {
head = linkB;
linkB = linkB.next;
head.next = null;
}
Node end = head;
comb(end, headA, headB);
return head;
}
// 实现递归
public void comb(Node end, Node headA, Node headB){
if(headA == null && headB == null){
return;
}else if(headA == null){
end.next = headB;
return;
}else if(headB == null){
end.next = headA;
return;
}
if(headA.data < headB.data){
end.next = headA;
headA = headA.next;
end = end.next;
end.next = null;
comb(end, headA, headB);
}else if(headA.data == headB.data){
end.next = headA;
headA = headA.next;
headB = headB.next;
end = end.next;
end.next = null;
comb(end, headA, headB);
}else {
end.next = headB;
headB = headB.next;
end = end.next;
end.next = null;
comb(end, headA, headB);
}
}

// 3.2 使用循环方式实现
// 循环实现
public Node comb(int[] arrayA, int[] arrayB){
// 转换链表
Node linkA = convert(arrayA);
Node linkB = convert(arrayB);
// 获取头节点
Node head;
if(linkA.data == linkB.data){
head = linkA;
linkA = linkA.next;
linkB = linkB.next;
head.next = null;
}else if (linkA.data < linkB.data){
head = linkA;
linkA = linkA.next;
head.next = null;
}else {
head = linkB;
linkB = linkB.next;
head.next = null;
}
Node end = head;
// 依次将较小的节点加到链表尾部
while(headA != null && headB != null){
if(headA.data < headB.data){
end.next = headA;
headA = headA.next;
end = end.next;
end.next = null;
}else if(headA.data == headB.data){
end.next = headA;
headA = headA.next;
headB = headB.next;
end = end.next;
end.next = null;
}else {
end.next = headB;
headB = headB.next;
end = end.next;
end.next = null;
}
}
// 如果其中一个链表为空,将另外一个链表直接添加到合成链表尾部
if(headA == null){
end.next = headB;
}else if(headB == null){
end.next = headA;
}
return head;
}

以上所述是小编给大家介绍的Android中关于递归和二分法的算法实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 我对这个代码有一些问题 问题1:终止情况究竟如何运作?s.length如何等于0? 问题2:为什么代码需要具有“firstChar”才能反转字符串?为什么当逆转字符串接受0的子字符串而不必添加第一个字符时,代码不起作用?

  • 本文向大家介绍java 二分法算法的实例,包括了java 二分法算法的实例的使用技巧和注意事项,需要的朋友参考一下 java 二分法算法的实例 1、前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2、原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后

  • 我正在处理一个递归二分法/算法。我已经把我的递归放在else/else if语句中,不知道我是否错了。它也返回正确的根,而没有递归,但主要问题是用递归。

  • 本文向大家介绍java递归算法的实例详解,包括了java递归算法的实例详解的使用技巧和注意事项,需要的朋友参考一下 递归三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 1、1+2+3+…+n 2、1 * 2 * 3 * … * n 3、斐波那契数列 前两项均为1,第三项开始,每一项都等于前两项之和。即:1,1,2,3,5,8,… 4、二叉树的遍

  • (这不是一个复制品)我们有一个2D迷宫,四面都有X,还有内部的方块<迷宫的所有这些特征都存储在2D数组中。程序必须找到从开始“S”到目标“G”的路径。为此,将使用一个名为“solve(int row,int col)”的布尔方法,并使用“S”的行和列索引初始化该方法。算法必须是递归的。如果它能够找到通往“G”的路径,那么它应该返回true,否则返回false。下面是我试图解决这个问题的方法,它显示

  • 本文向大家介绍Java实现的质因数分解操作示例【基于递归算法】,包括了Java实现的质因数分解操作示例【基于递归算法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的质因数分解操作。分享给大家供大家参考,具体如下: 这里演示java通过递归实现质因数分解,代码如下: 运行结果: PS:这里提供一款功能相似的在线工具供大家参考:在线分解质因数计算器工具 http://tools