呵呵 不知道写的如何。但是总感觉,在UltraEdit下写,还是很爽的,或许是因为学校办公室的电脑内存太小的缘故吧。
1 /**
2 * @the author:Nicky(EN) QuQiang(CH)
3 * @the data :2006.8.27
4 **/
5 // 当然本算法最好编制成两到3个文件
6
7 public class HalfSearch{
8 private static int lengthValue;
9 private static byte flag=0;
10 private static int SearchValue=0;
11
12 //定义返回数组类型的方法 此方法给出的public权限
13 public static int[] Sort(int[] b){
14 for(int i=0;i<b.length;i++){
15 for(int j=i+1;j<b.length;j++){
16 int temp;
17 if(b[i]>b[j]){
18 temp=b[i];b[i]=b[j];b[j]=temp;
19 }
20 }
21 }
22 System.out.println("\u6309\u5e8f\u6392\u5217\u4e3a:"); //对应汉字为 按序排列为:
23 for(int i=0;i<b.length;i++){
24 System.out.println(b[i]);
25 } //冒泡排序法排序 或直接使用JDK提供的sort()函数进行排列
26 return b;
27 }
28
29 //折半查找
30 private static int Half(int[] a){
31 int m=a.length,k,n=1;
32 System.out.println("\u5f53\u524d\u5171\u8f93\u5165"+m+"\u4e2a\u6570\u7b26"); //对应汉字为 "当前共输入" 个数符
33 int index=0;
34 if(m==1){
35 if(a[0]==SearchValue){
36 flag=1;
37 index=1;
38 }
39 else{
40 flag=0;
41 index=1;
42 }
43 } //考虑到用户除输入查找数符外,只输入一个数符,即n=m=1
44 for(int i=1;;i++){
45 if(n<m){
46 index+=1;
47 k=(n+m)/2;
48 if(a[k-1]>SearchValue){
49 m=k-1; //此时定义最大值为当前中间值的前一个值 //第 次查找未成功,当前值大于SearchValue
50 System.out.println("\u7b2c"+index+"\u6b21\u67e5\u627e\u672a\u6210\u529f\uff0c \u5f53\u524d\u503c\u5927\u4e8e"+SearchValue);//否则将9改为变量
51 }else if(a[k-1]<SearchValue){
52 n=k+1; //未找到,则在后半区间进行查找 //小于
53 System.out.println("\u7b2c"+index+"\u6b21\u67e5\u627e\u672a\u6210\u529f\uff0c \u5f53\u524d\u503c\u5c0f\u4e8e"+SearchValue);//否则将9改为变量
54 }else{
55 System.out.println("\u67e5\u627e\u6210\u529f"); //查找成功
56 flag=1;
57 break;
58 }
59 }else break;
60 }
61 return index;
62 } //也可以定义一个用户需输入的查找值
63
64 //使用说明
65 private static void usage(){
66 System.out.println("Usage:java HalfSearch program [the number you search] [the array list you give]");
67 System.out.println("\t [the number you search] the only number you want to use it to test this program");
68 System.out.println("\t [the Array list you give] A array list may be it contains it may be not");
69 System.exit(0);
70 }
71
72 //主函数的功能 传入查找数组
73 public static void main(String[] args){
74 if(args.length==0||args.length==1){
75 usage();
76 System.exit(0);
77 }
78 SearchValue=Integer.parseInt(args[0]);
79 lengthValue=args.length;
80 int index=0;
81 int[] TransArray=new int[args.length-1];
82 for(int i=1;i<args.length;i++){
83 TransArray[i-1]=Integer.parseInt(args[i]);
84 System.out.println(TransArray[i-1]);
85 }
86 index=HalfSearch.Half(HalfSearch.Sort(TransArray));
87 //输出查询结果
88 switch(flag){
89 //在本次折半查找中共经过 次查找,未成功 成功
90 case 0: System.out.println("\u5728\u672c\u6b21\u6298\u534a\u67e5\u627e\u4e2d\u5171\u7ecf\u8fc7"+index+"\u6b21\u67e5\u627e,\u672a\u6210\u529f");break;
91 case 1: System.out.println("\u5728\u672c\u6b21\u6298\u534a\u67e5\u627e\u4e2d\u5171\u7ecf\u8fc7"+index+"\u6b21\u67e5\u627e,\u6210\u529f");break;
92 }
93 System.exit(0);
94 }
95 }