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