把一个无序的数组排序后用折半法查找其中一个数,然后怎样输出这个数字没排序前的下标
发布网友
发布时间:2022-04-24 06:29
我来回答
共1个回答
热心网友
时间:2023-10-08 20:58
package ch02;
import java.util.Scanner;
public class MyTest
{
public static void main(String[] args)
{
System.out.println("请输入要查的数字总数");
int t=getInt();
if(t<=0)
System.out.println("错误");
else
{
System.out.println("请输入"+t+"个数字");
int a[]=new int[t];
for(int i=0;i<a.length;i++)
{
a[i]=getInt();
}
System.out.println("请输入要查的数字");
int h=getInt();
//记得做一个备份,用于查询排序前的,由于数组是通过地址,所以没有备份数据,排序后就没有原始数据了
int c[]=a.clone();
int result=search(a,h);
if(result==-1){
System.out.println("没找到");
}else{
System.out.println("排序后这是第"+result+"个");//这个是排序后的下标了。
int k=searchBefore(c,h);
// 这个是排序前的下标。
System.out.println("排序前这是第"+k+"个");
}
}
}
// 这个是排序后查询的下标(原有程序)
static int search(int a[],int b)
{
int z=0;
for(int i=0;i<a.length-1;i++)
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j]>a[j+1])
{z=a[j];a[j]=a[j+1];a[j+1]=z;}
}
}
int low=0,high=a.length-1;
int mid=(low+high)/2;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==b)
return mid+1;
else if(a[mid]>b)
high=mid-1;
else if(a[mid]<b)
low=mid+1;
}
return -1;
}
//这个查询没排序的下标
static int searchBefore(int b[],int c)
{
int j=0;
for(int i=0;i<b.length;i++){
if(c==b[i]){
j=++i;
break;
}
}
return j;
}
static int getInt(){
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
return i;
}
}
楼主建一个MyTest的类,把这个拷贝进去就可以运行了追问非常感谢你~
关于查询没排序的下 标还有些问题
searchbefore使用折半法了么。
我想要一个即使用折半法又能输出想查找的数字原有位置的程序
类似于给输入一个数字绑定一个号码 折半法排序后号码顺序是不变的
可以实现么? 请在帮帮我吧
........唉