问题描述
二进制搜索和冒泡问题。无法理解二进制搜索伪代码的问题。为了获得目标编号的索引,我需要更改什么?
import java.util.*;
public class Binarysearch2 {
static void bubblesort(int dizi[]){ // bubblesort //
int o,p,temp;
for(o=0;o<dizi.length-1;o++)
{
for(p=0;p<dizi.length-1-o;p++)
{
if(dizi[p+1]>dizi[p]){
temp=dizi[p];
dizi[p]=dizi[p+1];
dizi[p+1]=temp;
}
}
}
}
static int search(int dizi[],int aranan) // binary search//
{
int ust=dizi.length-1;
int alt=0;
while(alt<=ust)
{
int orta=(alt+ust)/2;
if(dizi[orta]==aranan){
return orta;
}
else if (orta<aranan)
{
alt=orta+1;
}
else
ust=orta-1;
}
return -1;
}
public static void main(String[]args) //main//
{
Scanner tara=new Scanner(System.in);
System.out.println("Enter array lenght");
int x=tara.nextInt();
Random rnd= new Random();
int i;
int a[]=new int[x];
for(i=0;i<x;i++)
{
a[i]=(1+rnd.nextInt(6));
System.out.print(a[i]+" ");
}
System.out.println();
System.out.println("Enter targeted number :");
int k,z;
k=tara.nextInt();
bubblesort(a);
z=Binarysearch2.search(a,k);
if(z==-1)
{System.out.println("Target is not in array.");}
else
System.out.println(k+" in array "+z +" . at this index.");
}}
我认为binarysearch中的某些内容是错误的。
解决方法
这里有个问题:
if (orta<aranan)
{
alt=orta+1;
}
您将比较索引而不是将值(dizi[orta]
)与目标(aranan
)进行比较。只需将条件替换为if (dizi[orta]<aranan)
此外,正如Anatoly在his answer中正确指出的那样,您的排序方向错误。当较低的气泡小于较大的气泡(if(dizi[p+1]>dizi[p]
时,气泡排序会交换元素。这意味着您正在按降序顺序排序。另一方面,您的搜索假定该数组以升顺序排序。
早上好, 如果您将使用英语来命名变量,那将真的很有帮助。二进制搜索是一个重要的假设,已在其中寻找元素的数组进行了排序。因此,如果您将排序方式添加到搜索方法中,则您的代码将起作用:
static int search(int dizi[],int aranan) {
int ust = dizi.length - 1;
int alt = 0;
Arrays.sort(dizi); // ADDED ELEMENT
while (alt <= ust) {
int orta = (alt + ust) / 2;
if (dizi[orta] == aranan) {
return orta;
} else if (orta < aranan) {
alt = orta + 1;
} else
ust = orta - 1;
}
return -1;
}
,
- 数组排序方向错误。在
bubblesort
上的dizi[p+1] > dizi[p]
上更改dizi[p+1] < dizi[p]
- 在
search
的{{1}}上更改else if (orta < aranan)