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;
 }
 
 
}