有序数组中的线性搜索 - Java

Posted

技术标签:

【中文标题】有序数组中的线性搜索 - Java【英文标题】:Linear search in a sorted array - Java 【发布时间】:2015-12-24 12:31:12 【问题描述】:

我想制作一个程序,在排序后的数组中进行线性搜索,并可以输出找到搜索项的不同位置。目前我的程序只输出找到搜索项的第一个位置,所以这里是我的程序现在所做的一个例子:

Enter number of elements
5
Enter 5 integers
1
3
3
9
15
Enter value to find
3
3 is present at location 2.

现在问题是 3 在位置 2 和 3,这就是我想在程序中编辑的内容,但我不知道该怎么做。

这是我的程序的代码:

import java.util.Scanner;
 class LinearSearchArray1 
    public static void main(String args[])
        int c, n, search, array[];

        Scanner in = new Scanner(System.in);
        System.out.println("Enter number of elements");
        n = in.nextInt(); 
        array = new int[n];

        System.out.println("Enter " + n + " integers");

        for (c = 0; c < n; c++)
        array[c] = in.nextInt();

        System.out.println("Enter value to find");
        search = in.nextInt();

        for (c = 0; c < n; c++)
        
            if (array[c] == search)     /* Searching element is present */
            
             System.out.println(search + " is present at location " + (c + 1) + ".");
            break;
        
    
    if (c == n)  /* Searching element is absent */
        System.out.println(search + " is not present in array.");
    

【问题讨论】:

Arrays.binarySearch 找到第一个位置。然后循环查找其他的 - 它们必须在一个排序数组中。 【参考方案1】:
...
System.out.println("Enter value to find");
search = in.nextInt();

boolean exists = false;

for (c = 0; c < n; c++)

  if (array[c] == search)     /* Searching element is present */
  
     System.out.println(search + " is present at location " + (c + 1) + ".");
     exists = true;
  


if (!exists)  /* Searching element is absent */
  System.out.println(search + " is not present in array.");

您需要删除break; 语句。否则,一旦找到第一个值,循环就会中断,并且永远无法到达下一个匹配项。

【讨论】:

天哪,其实就是这么简单,只剩下一个问题:我得到“数组中不存在 3”。在最后一行。 其实,你需要一个像旗子这样的东西。检查我的编辑。 @Sparta 这将每次扫描整个阵列。对下一个不相等的值进行中断会更好,因为数组已排序。 (当然,对于较大的数组,二分查找会更好) @Danny_ds 你是对的,完全错过了排序的事实。【参考方案2】:

此代码可能对您有用。

    int c = 0;

    while (c < array.length && array[c] < search)
    
        cc++;
    
    int first = c;
    while (c < array.length && array[c] == search) 
        c++;
    
    int last = c;

现在索引“first”和“last”(包括它们)之间的元素包含搜索到的数字。因此,您基本上会搜索与您要查找的相同的第一个和最后一个元素。 将其写入控制台的示例:

    for (int i = first; i <= last; i++)
    
        System.out.println(search + " is present at location " + (i + 1) + ".");
    

【讨论】:

不,last 元素不包含所需的值。事实上,如果所有元素都小于或等于searchlast 将在数组之外。代码是正确的(除了cc 而不是c),事实上它正是我会使用的。然而,在代码之后,我们知道有确切的last-first 元素匹配search(注意这可能是零),这些元素在first(包括)和last(不包括)之间。如果将&lt;= 更改为&lt;,则最后一个for 可以正常工作。该循环中没有迭代意味着search 不在数组中。【参考方案3】:
import java.util.Scanner;

public class BinarySearch 
    /*
     * A binary search or half-interval search algorithm finds the position of a
     * specified value (the input "key") within a sorted array. Binary search
     * requires a sorted collection. Also, binary searching can only be applied
     * to a collection that allows random access (indexing).
     * 
     * Worst case performance: O(log n)
     * 
     * Best case performance: O(1)
     */

    public static int binSearch(int a[], int key) 
        int start = 0;
        int end = a.length - 1;

        while (start <= end) 
            int mid = (start + end) / 2;

            if (key == a[mid]) 
                return mid;
            
            if (key < a[mid]) 
                end = mid - 1;
             else 
                start = mid + 1;

            

        
        return -1;

    

    public static void main(String arg[]) 

        BinarySearch bi = new BinarySearch();
        int[] arr =  2, 4, 6, 8, 10, 12, 14, 16 ;
        System.out.println("Please Key to be search");
        Scanner sc = new Scanner(System.in);
        int input = Integer.parseInt(sc.nextLine());

        if (bi.binSearch(arr, input) != -1) 
            System.out.println(input + ": " + " Search found at "
                    + bi.binSearch(arr, input) + " " + "Position");
         else 
            System.out.println(input + ": " + " Search Result not found ");
        

    

【讨论】:

【参考方案4】:

使用ArrayList来存储位置:-

导入 java.util.ArrayList; 导入 java.util.Scanner;

类 LinearSearchArray1

public static void main(String args[])

    int c, n, search, array[];
    boolean searchStatus=false;

    ArrayList<Integer> al=new ArrayList<Integer>();

    Scanner in = new Scanner(System.in);
    System.out.println("Enter number of elements");
    n = in.nextInt(); 
    array = new int[n];
    System.out.println("Enter " + n + " integers");
    for (c = 0; c < n; c++)
        array[c] = in.nextInt();
    System.out.println("Enter value to find");
    search = in.nextInt();
    for (c = 0; c < n; c++)
    
        if (array[c] == search)     /* Searching element is present */
        
         al.add(c+1);
         searchStatus=true;  
    

if (searchStatus==false)  /* Searching element is absent */
    System.out.println(search + " is not present in array.");
else 
    System.out.print(search+ " is present in array at location ");
    for(Integer i:al) 
        System.out.print(i+",");


【讨论】:

以上是关于有序数组中的线性搜索 - Java的主要内容,如果未能解决你的问题,请参考以下文章

有序数组中线性搜索的复杂度分析

有序线性表(存储结构数组)--Java实现

经典面试算法题:线性查找有序二维数组

Java数据结构和算法( 二 ) ## 数组

Java 求解将有序数组转换为二叉搜索树

⭐算法入门⭐《线性枚举》简单03 —— LeetCode 26. 删除有序数组中的重复项