- class InsertTest
- {
- public static void main(String[] args)
- {
- int[] arr = {8,2,5,3,6,2,9,23,1};
- int[] newarr = insert(arr);
- for(int a : newarr)
- {
- System.out.println(a);
- }
- }
-
- public static int[] insert(int[] arr)//封装成一个方法以便函数调用,
- {
- for (int x=1;x<arr.length ;x++ )
- {
- //这里这么定义只是为了好理解
- int value = arr[x];// 待插入的值
- int index = x;// 待插入的位置
-
- //循环判断条件比较大小,当index>0时,比较条件满足直接交换值,插入了值与此同时待插入的角标位重新赋值,角标位向前移动。
- while (index>0 && value<arr[index-1])
- {
- //定义第三方变量,插入值
- int temp=arr[index];
- arr[index]=arr[index-1]; //待插入的位置重新赋更大的值
- arr[index-1]=temp;
- index--; //位置向前移动。
- }
- }
- return arr; //返回一个数组以便对象调用。
- }
- }
复制代码 楼主的代码中定义了一个新的数组newarr,但是没有真正的起作用,而且还让代码变得复杂了;
简化代码,可以去掉newarr的定义以及所有用到它的地方。因为你将数组中从角标1开始的数和前面所有的相比,这样每次比完,前面的都是排好序的。
得到的数组就是已经排好序的了,不需要再赋给新的数组返回。
要想折半插入,就要用到那个新数组,但是要保证插入的数组是有序的。然后找到一个数在该数组中应该插入的位置,就好了。
折半查找位置代码如下:- //折半查找,提高效率,但必须保证数组有序
- public static int halfSearch(int[] arr,int key)
- {
- int min,max,mid;
- min=0;
- max=arr.length-1;
- mid = (min+max)/2;
- while(arr[mid]!=key)
- {
- if(key>arr[mid])
- min=mid+1;
- else
- max=mid-1;
- if(min>max)
- return -1;
- mid=(min+max)/2;
- }
- return mid;
- }
复制代码 |