黑马程序员技术交流社区

标题: 二分查找问题 [打印本页]

作者: kk8023    时间: 2015-1-26 00:26
标题: 二分查找问题
package arry;
//需求:给定一个数组,对数组进行排序,并且查找数组中的某一个元素
/*
* 思路:1,对数组进行排序,选用冒泡排序方法;
*      2.定义一个打印的方法;
*      3.查找有序数组中的某一个元素,可以使用二分查找方法;
* */
public class ArryDemo11 {
        public static void main(String args[])
        {
                int arr[] ={28,38,98,17,39,87,88};
                printInfor(arr);   //传递一个参数到打印方法中
                bubbleSort(arr);
                printInfor(arr);
                int ind =halfSearch(arr,98);
                System.out.println("角标:"+ind);
        }
       
        //冒泡排序:
        /*思路:实质是两个相邻元素之间互相比较,若符合要求,那么就互相交换位置
         *   1.首先从数组中第一个元素到倒数第二个元素,依次与其右边的元素进行比较,若左边的元素大于右边的元素,
         *     那么就互相交换位置;
         *   2.经过第一轮比较后,元素的最值就会到最右边的节点上去,
         *   3.再进行第二轮比较,在从第一个元素到倒数第三个元素进行比较,若左边的元素大于右边的元素,那么就
         *     进行换位;
         *   4.以此类推,直到第一个元素与第二个元素比较完;
         * */
        public static   void bubbleSort(int arr[])
        {
                for (int x=0;x<arr.length-1;x++)  //-1是因为最后一个数没有右边
                {
                        for(int y=0;y<arr.length-x-1;y++)    //-x是因为每经过一轮就就有x个元素位置已经排好,-1是为了防止越界
                        {
                                if(arr[y]>arr[y+1])
                                {
                                        int temp =arr[y];
                                        arr[y]=arr[y+1];
                                        arr[y+1]=temp;
                                }
                        }
                }
        }
       
        //定义一个打印数组的方法
        /*两个明确:1.返回值类型为空;
         *       2.在运算过程中有未知内容参与运算:传递一个int类型的数组。
         * */
        public static void printInfor(int arr[])
        {
                System.out.print("{");
                for(int x=0;x<arr.length;x++)
                {
                        if(x!=arr.length-1)
                        {
                                System.out.print(arr[x]+"\t");
                        }
                        else
                        {
                          System.out.println(arr[x]+"}");       
                        }
                }
        }
       
        //二分查找法查找数组中的某一个元素   
        /*
         * 注:二分查找法是对有序数组进行查找
         *  思路:1.定义3个变量,min,mid,max,其中min=0,mmax=arr.length-1,mid=(min+max)/2;
         *       2.首先要将待查找的数与mid角标所对应的元素进行比较,若两个数相等,那么就返回该角标,并且程序终止执行;
         *       3.若不相等,如果待查找的元素大于mid角标所对应的元素,此时待查找的元素就在mid和max角标
         *         所对应的元素之间,那么min=mid+1,mid=(min+max)/2;然后在执行第二个步骤;
         *       4.若待查找的元素小于mid角标所对应的元素,那么待查找的元素就在mid和min角标所对应的元素之间,
         *         然后在执行第二步流程;
         *       5.若待查找的元素不在数组中,那么就返回-1,此时会出现min>max的情况;   
         * */
         public static int halfSearch(int arr[],int key)
         {
                 int min,max,mid;
                 min=0;
                 max=arr.length-1;     //max表示的是最大角标值
                 mid=(min+max)/2;
                 while(key!=arr[mid])
                 {
                         if(key>arr[mid])
                                {
                                 min=mid+1;
                                }
                         else if(key<arr[mid])
                         {
                                 max=mid-1;
                         }
                         if(min>max)
                         {
                                 return -1;
                         }
                         mid =(min+max)/2;
                 }
                 return mid;
         }
}


问题1:为什么我在printInfor("排序前"+arr)里面加上“排序前”程序会报错:The method printInfor(int[]) in the type ArryDemo11 is not applicable for the arguments (String)?
问题2:经过bubbleSort(arr)冒泡排序后,已经拍好了数组,但是并没有打印出来,此时需要调用printInfor(arr)方法,那么忘打印方法中传递的参数为什么是已经排序好的arr参数,而不是最开始初始化的数组int arr[] ={28,38,98,17,39,87,88};他是怎么区分的??


作者: 邓士林    时间: 2015-1-26 09:00
1、printInfor(int arr[]),此函数接收一个int类型数组,你穿如字符串 + 数组名肯定不行啊!调用函数要保持参数类型一致性。
2、你理解的是二者不是同一个数组,怎么区分,因为数组是引用类型,你调用排序算法的时候,传的数组对象的引用,所以你排序肯定会影响到主函数中的arr对象。它们是一个东西,就是arr,不需要区分。
作者: kk8023    时间: 2015-1-26 18:59
邓士林 发表于 9 小时前
1、printInfor(int arr[]),此函数接收一个int类型数组,你穿如字符串 + 数组名肯定不行啊!调用函数要保持参数类型一致性。
2、你理解的是二者不是同一个数组,怎么区分,因为数...

嗯,谢谢啦,第一个懂了,第二个还是不太明白。




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