黑马程序员技术交流社区

标题: 在一个有序数组中利用折半查找的思想,来插入一个元素... [打印本页]

作者: czb    时间: 2014-9-13 11:48
标题: 在一个有序数组中利用折半查找的思想,来插入一个元素...
  1. <p>class Demo{
  2.         static int halfsearch(int arr[],int key){
  3.                 int min=0;
  4.                 int max=arr.length;
  5.                 int mid=(min+max)/2;
  6.                 while(min<=max){
  7.                         mid=(min+max)/2;
  8.                         if(key>arr[mid])
  9.                         {
  10.                                 min=mid+1;
  11.                         }
  12.                         else if(key<arr[mid])
  13.                         {
  14.                                 max=mid-1;
  15.                         }
  16.                         else
  17.                                 return mid;
  18.                 }
  19.                 return mid;
  20.         }
  21.         /**
  22.          * 在一个有序数组中利用折半查找的思想,来插入一个元素,使得插入后的数组依然有序,代码实现返回插入的位置。
  23.          * */
  24.         public static void main(String args[]){
  25.                 int arr[]={1,2,4,5,6,7,9};       
  26.                
  27.                 System.out.print(halfsearch(arr,-1));//这程序有个问题就是当要插入的数比数组中的最大元素大时,会发生数组角标越界的情况

  28.         }
  29. }</p><p>要如何修改呢?
  30. </p>
复制代码


作者: czb    时间: 2014-9-13 11:55
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {

  5.                 int[] arr = new int[]{1,6,9,11,18,54,60,66,90};
  6.                 System.out.println("insert 19 to array:");
  7.                 printArr(arr);
  8.                 int[] newArr = insert( arr, 100 );
  9.                 printArr( newArr );

  10.         }

  11.         //打印一个数组
  12.         public static void printArr(int[] arr)
  13.         {
  14.                 for (int x = 0; x<arr.length; x++ )
  15.                 {
  16.                         if (x == arr.length - 1)
  17.                         {
  18.                                 System.out.println(arr[x]);
  19.                                 break;
  20.                         }
  21.                         System.out.print(arr[x] + "\t");
  22.                 }
  23.         }

  24.         //在数组中插入一个元素
  25.         public static int[] insert( int[] arr, int insertKey )
  26.         {
  27.        
  28.         int loc, mid;
  29.         int[] newArr = new int[arr.length + 1];

  30.         mid = locFind( arr, insertKey );

  31.         //插入新元素操作,分三种情况,在首部,在尾部,在中间
  32.         if (insertKey < arr[0])//在首部
  33.         {
  34.                 newArr[0] = insertKey;
  35.                 for ( int x = 1; x <= arr.length; x++ )
  36.                 {
  37.                         newArr[x] = arr[x - 1];
  38.                 }
  39.         }
  40.         else if (insertKey > arr[arr.length - 1])//在尾部
  41.         {
  42.                 int x;
  43.                 for (x = 0 ; x < arr.length ; x++ )
  44.                 {
  45.                         newArr[x] = arr[x];
  46.                 }
  47.                 newArr[x] = insertKey;
  48.         }
  49.         else//在中间
  50.         {
  51.                 for ( loc = 0; loc <= mid; loc++ )//插入位之前的元素赋值给新数组
  52.                 {
  53.                         newArr[loc] = arr[loc];
  54.                 }

  55.                 newArr[loc] = insertKey;
  56.                
  57.                 for ( loc++; loc < newArr.length; loc++ )//插入位之后的元素赋值给新数组
  58.                 {
  59.                         newArr[loc] = arr[loc - 1];
  60.                 }

  61.         }

  62.         return newArr;

  63.         }


  64.         //用折半查找法找到元素应该插入数组的位置并返回
  65.         public static int locFind( int[] arr, int insertKey )
  66.         {

  67.         int min, mid, max;

  68.         min = 0;
  69.         max = arr.length;
  70.         mid = ( max + min ) / 2;

  71.         while ( min < max )
  72.         {
  73.                 if ( insertKey > arr[mid] )
  74.                 {
  75.                         min = mid + 1;
  76.                 }
  77.                 else if ( insertKey < arr[mid] )
  78.                 {
  79.                         max = mid - 1;
  80.                 }

  81.                 mid = ( max + min ) / 2;
  82.         }

  83.         return mid;

  84.         }
  85. }
复制代码
经过我的修改,代码已经可以实现了,原来要分成三种情况来判断插入的位置~


作者: czb    时间: 2014-9-13 12:27
关于越界图解

3RWRYADN@Y(AUN~V{7HVV`V.jpg (65.23 KB, 下载次数: 75)

3RWRYADN@Y(AUN~V{7HVV`V.jpg





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