Java 对于在排序和旋转数组中搜索元素

Java 对于在排序和旋转数组中搜索元素

假设您有一个没有重复值的排序数组,并且从某个索引开始,该数组发生了旋转。您必须在其中搜索特定的元素。如果数组中存在该元素,则返回其索引,否则返回-1。

在本文中,我们将使用两种方法解决给定的问题,即线性搜索和二进制搜索。

方法1:使用线性搜索

该方法将以顺序的方式搜索给定元素。

步骤

  • 步骤1 - 首先,声明并初始化一个名为’araylist’的数组和一个名为’searchElem’的整数变量,这是我们要在数组中搜索的元素。我们还需要两个整数变量’isFound’和’location’。

  • 步骤2 - 现在,创建一个for循环,它将运行到数组的长度。在此循环中,使用一个if块来检查数组中是否存在’searchElem’。如果可用,将其索引存储在变量’location’中,并将变量’isFound’增加到1。

  • 步骤3 - 接下来,我们创建一个if else块来检查变量’isFound’是否增加到1。如果等于1,表示找到了元素,并返回索引。如果不是,则执行else块中的语句。

示例1

public class Linear {
   public static void main(String[] args) {
      int araylist[] = {87, 89, 93, 0, 2, 5, 19};
      int searchElem = 2;
      int isFound = 0;
      int location = 0;
      for(int i = 0; i < araylist.length; i++) {
         if(searchElem == araylist[i]) {
            isFound = 1;
            location = i;
         } 
      }
      if(isFound == 1) {
         System.out.print("The given element is available at index: " + location);
      } else {
         System.out.print("Element is not available");
      }
   }
}

输出

The given element is available at index: 4

方法2:使用二分搜索

这种方法使用分而治之的规则来搜索给定的元素。

步骤

  • 步骤1 - 首先,声明并初始化一个名为’araylist’的数组和一个名为’searchElem’的整数变量。我们将在数组中搜索’searchElem’。

  • 步骤2 - 我们创建一个参数化方法,返回类型为int,命名为’bSearch’,并带有两个类型为int的参数’araylist[]’和’searchElem’。

  • 步骤3 - 在方法’bSearch’中,我们将声明并初始化变量’l’,用于存储数组的第一个索引,以及’h’,用于存储数组的最后一个索引。

  • 步骤4 - 接下来,我们创建一个while循环,它将从第一个索引运行到最后一个索引。在这个循环中,我们声明一个整数变量’mid’,用于存储数组的中间索引。然后,我们创建一个if块,用于检查’mid’索引是否找到了’searchElem’。如果找到了,将返回mid索引。

  • 步骤5 - 现在,我们创建第二个if块,用于检查左侧数组是否已排序。如果已排序,则在下一个if块中再次检查’searchElem’是否在第一个索引和mid索引之间。如果在它们之间,则’mid-1’成为最后一个索引,否则’mid + 1’成为第一个索引。

  • 步骤6 - 如果左侧数组未排序,那么意味着右侧数组已排序。因此,在else块中,我们创建另一个if块,用于检查’searchElem’是否在mid索引和最后一个索引之间。如果在它们之间,则’mid + 1’成为第一个索引,否则’mid-1’成为最后一个索引。

示例2

public class Binary {
   public int bSearch(int araylist[], int searchElem) {
      int l = 0;
      int h = araylist.length - 1;
      while(l <= h) {
         int mid = (l + h) / 2;
         if(araylist[mid] == searchElem) {
            return mid;
         }
         if(araylist[l] <= araylist[mid]) {
            if(searchElem >= araylist[l] && searchElem < araylist[mid]) {
               h = mid - 1;
            } else {
               l = mid + 1;
            } 
         } else {
            if(searchElem > araylist[mid] && searchElem <= araylist[h]) {
               l = mid + 1;
            } else {
               h = mid - 1;
            }
         }
      }
      return -1;
   }
   public static void main(String[] args) {
      int araylist[] = {87, 89, 93, 0, 2, 5, 19};
      int searchElem = 2;
      Binary obj = new Binary(); 
      // object creation 
      System.out.println("The given element is available at index: " + obj.bSearch(araylist, searchElem)); 
      // calling method with arguments
   }
}

输出

The given element is available at index: 4

结论

在本文中,我们讨论了在排序和旋转的数组中搜索元素的两种方法。二分查找方法比线性查找更优化,它使用分治算法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程