Java—折半查找和插入

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiaoke5491/article/details/101714473

给定的一组从小到大的数组,从键盘输入一个正整数,然后插入该数组后保持数组依旧有序。
思路:数据结构学过折半查找,也叫二分查找。
折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
查找图如下:
在这里插入图片描述
实现代码:

import java.util.Scanner;
public class Thirty {
 static Scanner sc = new Scanner(System.in);
 static int h=sc.nextInt();
 static int[] a={1,2,5,10,15,20,30,35,45};
 static int low=0;
 static int heigh=a.length-1;
  static int mid=(low+heigh)/2;
  static int mid1;
  public static void main(String[] args) {
  System.out.println("数组a的大小"+a.length);
  System.out.print("数组a=[");
  for(int i=0;i<=a.length-1;i++){
   System.out.print(a[i]+" ");}
  System.out.print("]");
  System.out.println();
  System.out.print("经过折半查找后,找到的应该插入的下标=");
  System.out.println(BinarySearch(h));
  insert(a,h);}
  //二分查找,找到这个数应该在数组的位置
  public static int BinarySearch(int nums){
   while(low<heigh){
    if(nums<a[mid]){
     heigh=mid-1;
     mid=(low+heigh)/2;
    }else if(nums>a[mid]){
     low=mid+1;
     mid=(low+heigh)/2;
     }
    }
   mid1=mid+1;
   return mid1;}
   //写一个方法来进行插入新的值
  public static int[] insert(int[] a,int data){
    int[] b=new int[a.length+1];
    System.out.println("数组b的大小"+b.length);
    System.out.print("插入前的数组=[");
    for(int i=0;i<=b.length-2;i++){
     b[i]=a[i];
     System.out.print(b[i]+" ");}
    System.out.println("]");   //打印插入数值前的数组
    //插入数值
    if(mid1>=0||mid1<b.length-1){
    for(int i=b.length-2;i>=mid1;i--){
    b[i+1]=b[i];
    }
    b[mid1]=h;
    }else if(mid1==b.length-1){
     b[b.length-1]=h;
    }
   for(int i=0;i<=b.length-1;i++){
    System.out.print(b[i]+" ");
    }
   return b;}}

测试结果:

在这里插入图片描述
在这里插入图片描述

这里比较重要的一句是
int[] b=new int[a.length+1];等于数组b的大小为数组a加1,然后再依次把a[0]到a[a.length-1]赋值给b[0]到b[b.length-2].
还有的就是找到了插入下标,要怎么移动元素呢。这就类似线性表的插入。注释里有。

猜你喜欢

转载自blog.csdn.net/xiaoke5491/article/details/101714473