package cn.by.Collecion.home0820;
import java.util.Comparator;
import java.util.List;
/**
 *
 *排序类
 */
public class Sort {
 
 
 /**
  * 根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口.
  *
  * @param list  要排序的列表
  */
 public static <T extends Comparable<? super T>> void sort(List<T> list) {
  /**
   *主要用于提前结束比较,即如果一趟中没有一个元素交换, 则后面还没有进行的趟也不用进行了。
   */
  int exchange;
  // 临时交换变量
  T temp;
  int length = list.size();
  for (int i = 0; i < length - 1; i++) {
   exchange = 0; // 初始值为0
   for (int j = length - 1; j > i; j--) {
    T after = list.get(j);
    T front = list.get(j - 1);
    if (after.compareTo(front) < 0) {
     temp = list.get(j);
     list.set(j, front);
     list.set(j - 1, temp);
     exchange = 1; // 如有交换则更改为1
    }
   }
   // 提前结束
   if (exchange == 0)
    return;
  }
 }
 
 /**
  * 根据指定比较器产生的顺序对指定列表进行排序。
  *
  * @param list  要排序的列表
  * @param c     确定列表顺序的比较器。null 值指示应该使用元素的自然顺序。
  */
 public static <T> void sort(List<T> list, Comparator<? super T> c) { 
  /**
   *主要用于提前结束比较,即如果一趟中没有一个元素交换, 则后面还没有进行的趟也不用进行了。
   */
  int exchange;
  // 临时交换变量
  T temp;
  if (c != null) {//比较器不为空
   int result;
   for (int i = 0; i < list.size() - 1; i++) {
    exchange = 0; // 初始值为0
    for (int j = list.size() - 1; j > i; j--) {
     T after = list.get(j);
     T front = list.get(j - 1);
     result = c.compare(after, front);
     // 比较
     if (result < 0) {
      temp = list.get(j);
      list.set(j, front);
      list.set(j - 1, temp);
      exchange = 1; // 如有交换则更改为1
     }
    }
    // 提前结束
    if (exchange == 0)
     return;
   }
  }
 
 
 
  //比较器为空时,应该使用元素的自然顺序
  int length = list.size();
  for (int i = 0; i < length - 1; i++) {
   exchange = 0; // 初始值为0
   for (int j = length - 1; j > i; j--) {
    T after = list.get(j);
    T front = list.get(j - 1);
    Comparable com = (Comparable) after;
    if (com.compareTo(front) < 0) {
     temp = list.get(j);
     list.set(j, front);
     list.set(j - 1, temp);
     exchange = 1; // 如有交换则更改为1
    }
   }
   // 提前结束
   if (exchange == 0)
    return;
  }
 }
 
 
 
 
}
 
 
 
 
 
 
 
 
package cn.by.Collecion.home0820;
import java.util.Comparator;
import java.util.List;
public class BinarySearch {
 
 
 
 /**
  * 使用二分搜索法搜索指定列表,以获得指定对象。
  * @param list   要搜索的列表
  * @param key    要搜索的键
  * @return       如果搜索键包含在列表中,则返回搜索键的索引,否则
  * 返回 (-(插入点) - 1)。插入点 被定义为将  * 键插入列表的那一点:
  * 即第一个大于此键的元素索引;如果列表中的所有元素 都小于指定的键,
  * 则为 list.size()。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。
  */
 public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {
  int low = 1;
  int high = list.size();
  int mid;
  int result;
  while (low <= high) {
   mid = (low + high) / 2;           
   //第一个比较元素为list.get(mid - 1),注意if判断时的符号
   result = list.get(mid - 1).compareTo(key);
   
   if (result == 0) {
    return mid;
   } else if (result > 0) {
    high = mid - 1;
   } else {
    low = mid + 1;
   }
  }
  // 没找到
  return -low;
 }
 
 
 
 
 /**
  * 使用二分搜索法搜索指定列表,以获得指定对象。
  * @param list  要搜索的列表
  * @param key   要搜索的键
  * @param c     排序列表的比较器。null 值指示应该使用元素的自然顺序。
  * @return      如果搜索键包含在列表中,则返回搜索键的索引,否则返回
  * (-(插入点) - 1)。插入点 被定义为将 键插入列表的那一点:即第一个大于
  * 此键的元素索引;如果列表中的所有元素 都小于指定的键,则为 list.size()。
  * 注意,这保证了当且仅当此键被找到时, 返回的值将 >= 0。
  */
 public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
  int low = 1;
  int high = list.size();
  int mid;
  int result;
 
        if( c != null) {//比较器不为空
  while (low <= high) {
   mid = (low + high) / 2;
   // System.out.println("mid="+mid);
   //第一个元素为key,注意if判断时的符号
   result = c.compare(key, list.get(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 -low;
        }
       
        //比较器为空时,使用元素的自然顺序比较
        while (low <= high) {
   mid = (low + high) / 2;           
   //第一个比较元素为list.get(mid - 1)
   Comparable com = (Comparable)list.get(mid - 1);
  
   result = com.compareTo(key);
  
   if (result == 0) {
    return mid;
   } else if (result > 0) {
    high = mid - 1;
   } else {
    low = mid + 1;
   }
  }
  // 没找到
  return -low;
       
 }
 
}

转载于:https://blog.51cto.com/baiyan425/1120459

用泛型的sort与binarySearch方法相关推荐

  1. 1.12 Java数组使用binarySearch()方法查找指定元素

    查找数组是指从数组中查询指定位置的元素,或者查询某元素在指定数组中的位置.使用 Arrays 类的 binarySearch() 方法可以实现数组的查找,该方法可使用二分搜索法来搜索指定数组,以获得指 ...

  2. Java基础(39)Arrays.binarySearch方法

    1.源码中可以看到,binarySearch方法调用了binarySearch0方法,binarySearch0方法才是标准的二分查找实现. 2.对于binarySearch0方法来说,注意最后的re ...

  3. Java中的binarySearch方法

    大家好,我是雄雄,今天我们来看看java中的binarySearch方法! 前言:我们都知道,如果我们想要在一个集合中查找某个元素所在的位置时,可以使用list类自带的indexOf方法,简单方便还快 ...

  4. [转载] Java 中的binarySearch方法

    参考链接: Java中的二分搜索binarySearch Java提供了一个操作Set . List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修 ...

  5. python中的sort排序加换行_python中sort()排序的方法

    python中sort()排序的方法 发布时间:2020-09-01 10:57:52 来源:亿速云 阅读:110 作者:小新 这篇文章主要介绍了python中sort()排序的方法,具有一定借鉴价值 ...

  6. C++中SORT函数使用方法

    C++中SORT函数使用方法 一.sort函数 1.sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑! ...

  7. list集合对sort的使用方法

    List集合的排序: java提供了两种排序方式,分别是Collections.sort(List)和Collections.sort(List,Commparator),下面就这两种方法的使用做详细 ...

  8. java中list集合对sort的使用方法

    List集合的排序: java提供了两种排序方式,分别是Collections.sort(List)和Collections.sort(List,Commparator),下面就这两种方法的使用做详细 ...

  9. JAVA一种获得泛型类泛型参数Class对象的方法

    我在最近的开发中遇到这样一种情形,就是有一个类需要使用泛型进行实现,但是又同时需要用到泛型的Class对象.然而由于Java泛型擦除没办法直接得到泛型参数的Class对象.本已打算放弃,但是在编写其它 ...

最新文章

  1. T extends Serializable这是什么意思呢?看明白这个,你的问题就自然而然的明白了!...
  2. Eclipse发布MicroProfile 1.4和2.0
  3. leetcode 1345. Jump Game IV | 1345. 跳跃游戏 IV(BFS)
  4. jhope代码分析以及网站结构
  5. 笔记《精通css》第2章 选择器,注释
  6. 斯坦佛编程教程-Unix编程工具(五)
  7. SpringBoot 中@Autowired 注入失效原因及解决方法
  8. 【华为云技术分享】解密TaurusDB存储端高并发之线程池
  9. h5 ios 滚动到底部_分享iOS平台使用H5原生滚动的下拉刷新功能v1.0.0 [不推荐]
  10. yii php 弹窗,Yii框架弹出框功能示例
  11. Microsoft Expression blend 3 新功能简介
  12. RGB 与 RGBA 与 16进制 与 HSL 之间的简单转换
  13. Intel处理器原子操作支持
  14. mysql 连续天数_MYSQL面试题:统计连续打卡天数
  15. 基于Token的WEB后台认证机制
  16. 关于根轨迹对于控制系统的一点理解
  17. 推荐几个2023年比较好用的youtube转换器
  18. 编写一个“绘画系统”
  19. 基本算法4.1堆积木
  20. 自动特征构建工具——featuretools

热门文章

  1. java.net.NoRouteToHostException: No route to host解决方法
  2. SQL Server:如何加入第一行
  3. 电脑一直弹出传奇游戏网页弹窗怎么办
  4. SLAM无人车 map_server在代码中切换地图,地图保存
  5. Activity生命周期Android,横屏切换不重新创建Activity, Activity的四种launchMode
  6. Map集合转换成实体类对象,实体类对象转换为map集合,互转工具类
  7. java类型之间的转换_java类型之间的转换
  8. python保持登录状态_Python-保持登录状态进行接口测试
  9. python命名时可以使用中文吗_Python命名约定
  10. html 元素换行_超文本标记语言的段落与换行显示!