黑马程序员_Java基础_04数组main函数args详解、数组排序、二分查找实例

来源:互联网 发布:淘宝网店推广方案 编辑:程序博客网 时间:2024/04/30 09:19
------- android培训ios培训、期待与您交流! ----------
一、main函数args详解
public class TestArray{
 public static void main(String args[]){
  int y=new Integer("3");   //这里如果 用 int[] y = new Integer(args.length); ,会提示不兼容的类型,原因是将integer 构造方法的值直接赋值给数组,而Integer没有返回类型为数组的构造方法,所以需要格外注意,追根到底还是定义数组的格式问题
  int a[]=new int[args.length]; 
  for(int i=0;i<args.length;i++){
   a[i]=Integer.parseInt(args[i]);
  }
  print(a);
  System.out.println(y);
  selectSort(a);
  print(a);
 }
 static void print(int[] a){
  for(int i=0;i<a.length;i++){
   System.out.print(a[i]+" ");
  }
  System.out.println();
 }
 static void selectSort(int[] a){
  for(int i=0;i<a.length;i++){
   for(int j=i+1;j<a.length;j++){
    if(a[j]<a[i]){
     int z=a[j];
     a[j]=a[i];
     a[i]=z;
    }
   }
  }
 }
}

以上版本还存在优化的空间,以下是优化过得程序
//优化版本
public class TestArrayOptimize{
 public static void main(String args[]){
  int y=new Integer("3");
  int a[]=new int[args.length];
  for(int i=0;i<args.length;i++){
   a[i]=Integer.parseInt(args[i]);
  }
  print(a);
  System.out.println(y);
  selectSort(a);
  print(a);
 }
 static void print(int[] a){
  for(int i=0;i<a.length;i++){
   System.out.print(a[i]+" ");
  }
  System.out.println();
 }
private static void selectSort(int[] a){  //这里可以将这个方法限定为内部访问
int k,temp;  //1
for(int i=0;i<a.length;i++){
k=i;
for(int j=k+1;j<a.length;j++){  //2
 if(a[j]<a[k]){
 k=j;
 }
}
if(a[i]!=a[k]){   //这里还需要有点注意的地方,就是比较 i与k的值比较,还是比较其下标的数组值,都可以,即 可以写成 if(i!=k)这样比较也可以,而且更好
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
}

以上这个版本主要做了两点优化
1、只在栈内存分配一次变量
2、排序时,从找到的更小的数往后继续比较大小,直到找到最小的数,然后与前面的数对调位置,完成内部循环,依次类推完成外部寻循环,直到完成比较。

二、折半查找法
public class BinarySearch{
 public static void main(String[] args){
  //int[] arr=new int[1,2,3,4,5,8,12,14,15,17,20,24];
   int[] arr={1,2,3,4,5,8,12,14,15,17,20,24};
  System.out.println(searchNum(arr,12));
  System.out.println(binarySearch(arr,24));//输出结果为 -1     —————— ①
  System.out.println(binarySearch(arr,1));//输出结果为0
 }
 //static void searchNum(int[] a,int num){
 public static int searchNum(int[] a,int num){
  for(int i=0;i<a.length;i++){
   if(a[i]==num){
    return i;
   }
  }
  return -1;
 }
 public static int binarySearch(int[] a,int num){
  if(a.length==0) return -1;
  int startPos=0;
  int endPos=a.length-1;//一开始这里忘记减去1,结果返回值为就返回-1。
  int index=(endPos+startPos)/2;
// for(int i=startPos;i<endPos;i++){
// if(a[i]==num){
// return i;
// }
// if(a[i]>num){
// startPos=index+1;
// }
// if(a[i]<num){
// endPos=index-1;
// }
// }     ————————————
  while(startPos<endPos){    //这里如果少了一个=号,—————— 
   if(a[index]==num){
     return index;
   }
   if(a[index]<num){
    startPos=index+1;
   }
   if(a[index]>num){
    endPos=index-1;
   }
   index=(startPos+endPos)/2;———————————————③
  }
  return -1;
 }
}

总结:
①一开始使用for循环想完成这个实例,但是失败了,需要思考原因,进一步查找资料
②使用while循环控制时,起始位置与结束位置应该可以相等,不然如果查找的数是最后一个数,会查找不到,返回-1;
③使用while循环时,需要记得加上这条语句,不然就会陷入死循环,无限循环下去  


0 0