黑马程序员技术交流社区

标题: 新手求助! [打印本页]

作者: 王亚男    时间: 2011-12-13 17:03
标题: 新手求助!
本帖最后由 qwert 于 2011-12-13 17:53 编辑

各位前辈,我还是个新手,在看毕向东老师的java基础视频。
今天看完之后开始自己写,然后遇到了一个问题,请各位前辈抽出些时间帮我查看一下:
  1. class Tool
  2. {
  3.         //返回最大值
  4.         public static int getMax(int[] arr)
  5.         {
  6.                 int max = 0;
  7.                 for (int x=1;x<arr.length;x++ )
  8.                 {
  9.                         if (arr[x]>arr[max])
  10.                         {
  11.                                 swap(arr,x,max);
  12.                         }
  13.                        
  14.                 }
  15.                         return arr[max];
  16.         }
  17.        
  18.         //返回最小值
  19.         public static int getMin(int[] arr)
  20.         {
  21.                 int min = 0;
  22.                 for (int x=1;x<arr.length;x++ )
  23.                 {
  24.                         if (arr[x]<arr[min])
  25.                         {
  26.                                 swap(arr,x,min);
  27.                         }
  28.                        
  29.                 }
  30.                         return arr[min];
  31.         }

  32.         //折半查找
  33.         public static int halfSort(int[] arr,int key)
  34.         {
  35.                 int max=arr.length-1,min=0,mid=(max+min)>>>1;
  36.                 while(key!=arr[mid])
  37.                 {
  38.                         mid=(max+min)>>>1;
  39.                         if(key>arr[mid])
  40.                         {
  41.                                 min=mid+1;
  42.                         }
  43.                         else if(key<arr[mid])
  44.                         {       
  45.                                 max=mid-1;
  46.                         }
  47.                         else if(max<min)
  48.                         {
  49.                                 return -1;
  50.                         }
  51.                 }
  52.                         return mid;
  53.                        
  54.         }

  55.         //冒泡排序
  56.         public static void bubbleSort(int[] arr)
  57.         {
  58.                 for (int x=0;x<arr.length-1;x++ )
  59.                 {
  60.                         for(int y=0;y<arr.length-x-1;y++)
  61.                         {
  62.                                 if(arr[y]>arr[y+1])
  63.                                 {
  64.                                         swap(arr,y,y+1);
  65.                                 }
  66.                         }
  67.                 }
  68.                         printArray(arr);
  69.         }

  70.         //选择排序
  71.         public static void selectSort(int[] arr)
  72.         {
  73.                 for (int x=0;x<arr.length-1;x++ )
  74.                 {
  75.                         for(int y=x+1;y<arr.length-1;y++)
  76.                         {
  77.                                 if (arr[x]>arr[y])
  78.                                 {
  79.                                         swap(arr,x,y);
  80.                                 }
  81.                         }
  82.                 }
  83.                         printArray(arr);
  84.         }
  85.        
  86.         //调换位置
  87.         private static void swap(int[] arr,int a,int b)
  88.         {
  89.                 int temp = arr[a];
  90.                 arr[a] = arr[b];
  91.                 arr[b] = temp;
  92.         }

  93.         //打印数组
  94.         private static void printArray(int[] arr)
  95.         {
  96.                         System.out.print("[");
  97.                 for (int i=0;i<arr.length;i++)
  98.                 {
  99.                         if(i!=arr.length-1)
  100.                         {
  101.                                 System.out.print(arr[i]+",");
  102.                         }
  103.                         else
  104.                                 System.out.print(arr[i]+"]"+"\n");
  105.                 }
  106.         }
  107. }

  108. class ArrayToolDemo
  109. {
  110.         public static void main(String[] args)
  111.         {
  112.         int[] arr={12,7,9,13,8,5,6,14};
  113.         //tool.bubbleSort(arr);
  114.         int x = Tool.getMin(arr);
  115.         int y = Tool.getMax(arr);
  116.         int z = Tool.halfSort(arr,14);
  117.        
  118.                 System.out.println("min="+x);
  119.                 System.out.println("max="+y);
  120.                 System.out.println(z);
  121.        
  122.         }
  123. }
复制代码
编译通过,然后java ArrayTestDemo时不出结果。
然后我把x和y ,还有System.out.println("min="+x);
                System.out.println("max="+y);
注释掉,就可以出结果。
单独把z注释掉,保留x和y也可以出结果,但就是三个一起输出没有结果。
请各位前辈帮我检查一下,不胜感激!!
作者: 李振元    时间: 2011-12-13 17:39
本帖最后由 李振元 于 2011-12-13 17:40 编辑

这个只需要改正一点,不是改正,你的方法也对,应该是修改:
只要将二班查找中的while(key!=arr[mid])改为while(min<=max)
至于具体原因,我也说不清楚,你自己悟悟吧,呵呵~~
代码如下:
//折半查找
        public static int halfSort(int[] arr,int key)
        {
                int max=arr.length-1,min=0,mid=(max+min)>>>1;
                //while(key!=arr[mid])
                while(min<=max)
                {
                        mid=(max+min)>>>1;
                        if(key>arr[mid])
                        {
                                min=mid+1;
                        }
                        else if(key<arr[mid])
                        {      
                                max=mid-1;
                        }
                        else if(max<min)
                        {
                                return -1;
                        }
                }
                        return mid;
                       
        }

ryt.PNG (5.51 KB, 下载次数: 32)

ryt.PNG

作者: 王亚男    时间: 2011-12-13 17:50
李振元 发表于 2011-12-13 17:39
这个只需要改正一点,不是改正,你的方法也对,应该是修改:
只要将二班查找中的while(key!=arr[mid])改为w ...

这样的确可以了呢!
不过,原因还得想想~
多谢前辈!!感激不尽!!
作者: 李振元    时间: 2011-12-13 17:57
qwert 发表于 2011-12-13 17:50
这样的确可以了呢!
不过,原因还得想想~
多谢前辈!!感激不尽!!

不是前辈,都是同学,呵呵~java这东西得慢慢来啊,一起努力!
作者: 王亚男    时间: 2011-12-13 18:24
李振元 发表于 2011-12-13 17:57
不是前辈,都是同学,呵呵~java这东西得慢慢来啊,一起努力!

哈哈~前辈,我悟到了~
我之前用getMin()和getMax()方法分别获取最小值和最大值,结果导致数组内的元素顺序都被打乱了。
而折半查找的特点在于只能对有序的数组进行查找。所以,出现了冲突。我把代码改了下,终于可以了!
谢谢前辈的提醒!
  1.         //折半查找
  2.         public static int halfSort(int[] arr,int key)
  3.         {
  4.                 int min=0,max=arr.length-1,mid=(max+min)>>1;//右移1位也是除2运算
  5.                 while(key!=arr[mid])
  6.                 {
  7.                         mid=(min+max)>>1;
  8.                         if(arr[mid]>key)
  9.                                 max=mid-1;
  10.                         else if(arr[mid]<key)
  11.                                 min=mid+1;
  12.                                  if(max<min)
  13.                                 return -1;
  14.                 }
  15.                                 return mid;
  16.                        
  17.         }
  18. class ArrayToolDemo
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.         int[] arr={12,7,9,13,8,5,6,14};
  23.        
  24.         int x = Tool.getMin(arr);
  25.         Tool.printArray(arr);
  26.         int y = Tool.getMax(arr);
  27.         Tool.printArray(arr);
  28.         Tool.bubbleSort(arr);
  29.         Tool.printArray(arr);
  30.         int z = Tool.halfSort(arr,13);       
  31.         System.out.println(z);
  32.         }
  33. }
复制代码

作者: 李振元    时间: 2011-12-13 18:34
qwert 发表于 2011-12-13 18:24
哈哈~前辈,我悟到了~
我之前用getMin()和getMax()方法分别获取最小值和最大值,结果导致数组内的元素顺 ...

这不也像你学习了吗:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2