版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
给定的一组从小到大的数组,从键盘输入一个正整数,然后插入该数组后保持数组依旧有序。
思路:数据结构学过折半查找,也叫二分查找。
折半搜索(英语: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].
还有的就是找到了插入下标,要怎么移动元素呢。这就类似线性表的插入。注释里有。