package cn.by.Collecion.home0818;

import java.util.Comparator;

/**
 *
 *排序类
 */
public class Sort {
 /**
  * 根据元素的自然顺序 对指定列表按升序进行排序。
  * 冒泡,从小到大排序
  * @param obj 要排序的数组
  */
 public static void sort(Object[] obj) {
  if(obj == null)
   throw new NullPointerException();
  
  /**
   *主要用于提前结束比较,即如果一趟中没有一个元素交换, 则后面还没有进行的趟也不用进行了。
   */
  int exchange = 0;

  // 临时交换变量
  Object temp;
  Comparable comparable;
  
  //System.out.println(obj.length);

  for (int i = 0; i < obj.length - 1; i++) {
   exchange = 0; //初始值为0
   for (int j = obj.length - 1; j > i; j--) {
    //强转
    comparable = (Student) obj[j];
    //比较
    if (comparable.compareTo(obj[j - 1]) < 0) {
     temp = obj[j];
     obj[j] = obj[j - 1];
     obj[j - 1] = temp;
     exchange = 1; // 如有交换则更改为1
    }

   }
   // 提前结束
   if (exchange == 0)
    return;

  }
  
 }
  
 /**
  * 根据指定比较器产生的顺序对指定列表进行排序 ,此列表内的所有元素都必须可使用指定比较器相互比较  
  * @param obj  要排序的数组
  * @param comparator 指定的比较器
  */
 public static void sort(Object[] obj, Comparator comparator) {
  if (obj == null)
   throw new NullPointerException();

  /**
   *主要用于提前结束比较,即如果一趟中没有一个元素交换, 则后面还没有进行的趟也不用进行了。
   */
  int exchange = 0;

  // 临时交换变量
  Object temp;
  int result; 
  for (int i = 0; i < obj.length - 1; i++) {
   exchange = 0; // 初始值为0
   for (int j = obj.length - 1; j > i; j--) {
    result =comparator.compare( obj[j],obj[j - 1] ) ;
    // 比较
    if (result < 0) {
     temp = obj[j];
     obj[j] = obj[j - 1];
     obj[j - 1] = temp;
     exchange = 1; // 如有交换则更改为1
    }

   }
   // 提前结束
   if (exchange == 0)
    return;
  }  
 }

}
 

 

 

package cn.by.Collecion.home0818;

import java.util.Comparator;

/**
 *
 *二分查找类
 */
public class BinarySearch {
 
 /**
  * 二分搜索
  * @param obj    要搜索的数组
  * @param argkey 要搜索的元素
  * @return       返回索引,如果找不到则返回-1
  */
 public static int binarySearch(Object[] obj, Object argkey ) {
  if(obj == null || argkey == null)
   throw new NullPointerException();
  
  int low = 1;
  int high = obj.length; 
  int mid;
  int result;
  Comparable comparable;
  
  while(low <= high) {
   
   mid = (low + high)/2;  
   
   comparable = (Student)argkey;
   //第一个元素为arykey
   result = comparable.compareTo(obj[mid - 1]);   
  
   if(result == 0)
    return mid;   
   else if(result < 0)
    high = mid - 1;
   else
    low = mid + 1;
   
  }
  //没找到
  return -1;
 }
 
 
 
 /**
  * 二分搜索
  * @param obj    要搜索的数组
  * @param argkey 要搜索的元素
  * @return       返回索引,如果找不到则返回-1
  * @param comparator 指定比较器(即指定元素相等规则)
  */
 public static int binarySearch(Object[] obj, Object argKey, Comparator comparator ) {
  if(obj == null || argKey == null)
   throw new NullPointerException();
 // System.out.println(argKey);
  int low = 1;
  int high = obj.length;
  int mid;
  int result;  
  
  while(low <= high) {
   
   mid = (low + high)/2;
   
   // System.out.println("mid="+mid);
   //第一个元素为arykey
   result = comparator.compare(argKey,obj[mid - 1]);
   
   if(result == 0)
    return mid;
   else if(result < 0){
    high = mid - 1;
    
    //System.out.println("high="+high);
    
    }
   else {
    low = mid + 1;
    
    // System.out.println("low="+low);
    
    }
   
  }
  //没找到
  return -1;
 }


 
}