一个小小的二分查找的问题。求大佬帮忙看看我哪里错了

么么西亚 2018-10-31 12:22:17
/*我的想法是先用类声明数组,每个数组元素都有一个t属性和v属性,v就是值,t记录原无序
* 数组中元素的位置,然后我把数组排序,再根据数组元素的v值进行二分查找,找到了以后根据t值输出原数组中的位置*/
package bbb;
import java.util.Scanner;

public class Binary {

public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int k=1;
System.out.println("输入个数");
int n=reader.nextInt();
Stu[] s=new Stu[500];
System.out.println("输入值");
for(int i=0;i<n;i++)
{
s[i]=new Stu();
s[i].v=reader.nextInt();
s[i].t=k;
k++;
}
//排序
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(s[j].v>s[j+1].v)
{
swap(s[j],s[j+1] );
}
}
}

if(binary(s, n)==-1)
{
System.out.println("找不到");
}
else
{
System.out.println("找到了,在第"+s[binary(s, n)].t+"个位置");
}
}
public static void swap(Stu x,Stu y)
{
Stu temp;
temp=x;
x=y;
y=temp;
}
public static int binary(Stu[] source, int key) {
int low = 0;
int high = source.length - 1;
while (low <= high) {
int mid = ( low + high ) /2;
int midVal = source[mid].v;
if ( midVal < key ) {
low = mid + 1;
} else if ( midVal > key ) {
high = mid - 1;
} else
return mid;
}
return -1;
}



}
class Stu
{
int v,t=0;//v为值 t为位置
}
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
么么西亚 2018-10-31
  • 打赏
  • 举报
回复
二分查找重新写了个还是不对,感觉不是二分那里的错误
么么西亚 2018-10-31
  • 打赏
  • 举报
回复
引用 3 楼 唐_方的回复:
有点错误,没有输入要查找的数 还有就是binary函数哪里是high = n-1 下面是我能够正常运行的代码,可以看看

package test;

import java.util.Scanner;

public class Binary {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int k = 1;
		System.out.println("输入个数");
		int n = reader.nextInt();
		Stu[] s = new Stu[500];
		System.out.println("输入值");
		for (int i = 0; i < n; i++) {
			s[i] = new Stu();
			s[i].v = reader.nextInt();
			s[i].t = k;
			k++;
		}
		//你这里没有输入要查找的数字
		System.out.println("輸入要查找的数字");
		int m = reader.nextInt();
		//冒泡排序
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - i - 1; j++) {
				if (s[j].v > s[j + 1].v) {
					swap(s[j], s[j + 1]);
				}
			}
		}

		if (binarySort(s,n,m) == -1) {
			System.out.println("找不到");
		} else {
			System.out.println("找到了,在第" + s[binarySort(s, n,m)].t + "个位置");
		}
	}

	public static void swap(Stu x, Stu y) {
		Stu temp;
		temp = x;
		x = y;
		y = temp;
	}

	public static int binarySort(Stu[] source, int n,int key) {
		int low = 0;
		int high = n - 1; //n为输入的个数
		while (low <= high) {
			int mid = (low + high) / 2;
			int midVal = source[mid].v;
			if (midVal < key) {
				low = mid + 1;
			} else if (midVal > key) {
				high = mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

}

class Stu {
	int v,t = 0;// v为值     t为位置
}

诶?,,可是我的n就是我输入要找的值啊。。我回去再试试
老许要老婆么 2018-10-31
  • 打赏
  • 举报
回复
空间命名有点挫!
么么西亚 2018-10-31
  • 打赏
  • 举报
回复
引用 3 楼 唐_方的回复:
有点错误,没有输入要查找的数 还有就是binary函数哪里是high = n-1 下面是我能够正常运行的代码,可以看看

package test;

import java.util.Scanner;

public class Binary {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int k = 1;
		System.out.println("输入个数");
		int n = reader.nextInt();
		Stu[] s = new Stu[500];
		System.out.println("输入值");
		for (int i = 0; i < n; i++) {
			s[i] = new Stu();
			s[i].v = reader.nextInt();
			s[i].t = k;
			k++;
		}
		//你这里没有输入要查找的数字
		System.out.println("輸入要查找的数字");
		int m = reader.nextInt();
		//冒泡排序
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - i - 1; j++) {
				if (s[j].v > s[j + 1].v) {
					swap(s[j], s[j + 1]);
				}
			}
		}

		if (binarySort(s,n,m) == -1) {
			System.out.println("找不到");
		} else {
			System.out.println("找到了,在第" + s[binarySort(s, n,m)].t + "个位置");
		}
	}

	public static void swap(Stu x, Stu y) {
		Stu temp;
		temp = x;
		x = y;
		y = temp;
	}

	public static int binarySort(Stu[] source, int n,int key) {
		int low = 0;
		int high = n - 1; //n为输入的个数
		while (low <= high) {
			int mid = (low + high) / 2;
			int midVal = source[mid].v;
			if (midVal < key) {
				low = mid + 1;
			} else if (midVal > key) {
				high = mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

}

class Stu {
	int v,t = 0;// v为值     t为位置
}

感谢大佬,终于找到问题了
么么西亚 2018-10-31
  • 打赏
  • 举报
回复
引用 3 楼 唐_方的回复:
有点错误,没有输入要查找的数 还有就是binary函数哪里是high = n-1 下面是我能够正常运行的代码,可以看看

package test;

import java.util.Scanner;

public class Binary {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int k = 1;
		System.out.println("输入个数");
		int n = reader.nextInt();
		Stu[] s = new Stu[500];
		System.out.println("输入值");
		for (int i = 0; i < n; i++) {
			s[i] = new Stu();
			s[i].v = reader.nextInt();
			s[i].t = k;
			k++;
		}
		//你这里没有输入要查找的数字
		System.out.println("輸入要查找的数字");
		int m = reader.nextInt();
		//冒泡排序
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - i - 1; j++) {
				if (s[j].v > s[j + 1].v) {
					swap(s[j], s[j + 1]);
				}
			}
		}

		if (binarySort(s,n,m) == -1) {
			System.out.println("找不到");
		} else {
			System.out.println("找到了,在第" + s[binarySort(s, n,m)].t + "个位置");
		}
	}

	public static void swap(Stu x, Stu y) {
		Stu temp;
		temp = x;
		x = y;
		y = temp;
	}

	public static int binarySort(Stu[] source, int n,int key) {
		int low = 0;
		int high = n - 1; //n为输入的个数
		while (low <= high) {
			int mid = (low + high) / 2;
			int midVal = source[mid].v;
			if (midVal < key) {
				low = mid + 1;
			} else if (midVal > key) {
				high = mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

}

class Stu {
	int v,t = 0;// v为值     t为位置
}

感谢大佬,,昨天搞了好久
唐_方 2018-10-31
  • 打赏
  • 举报
回复
有点错误,没有输入要查找的数 还有就是binary函数哪里是high = n-1 下面是我能够正常运行的代码,可以看看

package test;

import java.util.Scanner;

public class Binary {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int k = 1;
		System.out.println("输入个数");
		int n = reader.nextInt();
		Stu[] s = new Stu[500];
		System.out.println("输入值");
		for (int i = 0; i < n; i++) {
			s[i] = new Stu();
			s[i].v = reader.nextInt();
			s[i].t = k;
			k++;
		}
		//你这里没有输入要查找的数字
		System.out.println("輸入要查找的数字");
		int m = reader.nextInt();
		//冒泡排序
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - i - 1; j++) {
				if (s[j].v > s[j + 1].v) {
					swap(s[j], s[j + 1]);
				}
			}
		}

		if (binarySort(s,n,m) == -1) {
			System.out.println("找不到");
		} else {
			System.out.println("找到了,在第" + s[binarySort(s, n,m)].t + "个位置");
		}
	}

	public static void swap(Stu x, Stu y) {
		Stu temp;
		temp = x;
		x = y;
		y = temp;
	}

	public static int binarySort(Stu[] source, int n,int key) {
		int low = 0;
		int high = n - 1; //n为输入的个数
		while (low <= high) {
			int mid = (low + high) / 2;
			int midVal = source[mid].v;
			if (midVal < key) {
				low = mid + 1;
			} else if (midVal > key) {
				high = mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

}

class Stu {
	int v,t = 0;// v为值     t为位置
}

qybao 2018-10-31
  • 打赏
  • 举报
回复
你的swap方法不会达到你的预期效果 为什么?你可以补一补参数传值传引用这方面的知识
public static void swap(Stu x,Stu y)
 {
 int temp;
 temp=x.v;
 x.v = y.v;
 y.v =temp;
 temp=x.t;
 x.t = y.t;
 y.t =temp;
 }
唐_方 2018-10-31
  • 打赏
  • 举报
回复
引用 7 楼 qq_40311377 的回复:
[quote=引用 3 楼 唐_方的回复:]有点错误,没有输入要查找的数 还有就是binary函数哪里是high = n-1 下面是我能够正常运行的代码,可以看看

package test;

import java.util.Scanner;

public class Binary {

	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		int k = 1;
		System.out.println("输入个数");
		int n = reader.nextInt();
		Stu[] s = new Stu[500];
		System.out.println("输入值");
		for (int i = 0; i < n; i++) {
			s[i] = new Stu();
			s[i].v = reader.nextInt();
			s[i].t = k;
			k++;
		}
		//你这里没有输入要查找的数字
		System.out.println("輸入要查找的数字");
		int m = reader.nextInt();
		//冒泡排序
		for (int i = 0; i < n - 1; i++) {
			for (int j = 0; j < n - i - 1; j++) {
				if (s[j].v > s[j + 1].v) {
					swap(s[j], s[j + 1]);
				}
			}
		}

		if (binarySort(s,n,m) == -1) {
			System.out.println("找不到");
		} else {
			System.out.println("找到了,在第" + s[binarySort(s, n,m)].t + "个位置");
		}
	}

	public static void swap(Stu x, Stu y) {
		Stu temp;
		temp = x;
		x = y;
		y = temp;
	}

	public static int binarySort(Stu[] source, int n,int key) {
		int low = 0;
		int high = n - 1; //n为输入的个数
		while (low <= high) {
			int mid = (low + high) / 2;
			int midVal = source[mid].v;
			if (midVal < key) {
				low = mid + 1;
			} else if (midVal > key) {
				high = mid - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

}

class Stu {
	int v,t = 0;// v为值     t为位置
}

诶?,,可是我的n就是我输入要找的值啊。。我回去再试试[/quote] 上面定义的n输入的个数,不是要查找的数,没有输入要查找的数,程序逻辑是正确的, 就是少了点东西

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧