转载请注明出处:http://blog.youkuaiyun.com/xiaojimanman/article/details/17754983
今天继续接上次的排序算法。今天就写希尔排序在java中的一种实现方式。
/**
* @param list
* @param c
* @Date: 2014-1-2
* @Author: lulei
* @Description: 希尔排序
*/
public static <T> void shellSort(List<T> list, Comparator<? super T> c) {
if (list == null){
return;
}
//初始步长设置为数组长度的一半
int d = list.size() / 2;
while (d >= 1) {
shellSort(list, c, d);
d /= 2;
}
}
/**
* @param list
* @param c
* @param d 步长
* @Date: 2014-1-2
* @Author: lulei
* @Description: 希尔排序中的每个分组采用直接插入排序实现
*/
public static <T> void shellSort(List<T> list, Comparator<? super T> c, int d) {
if (list == null){
return;
}
//插入排序实现排序
for (int i = d; i < list.size(); i++) {
T temp = list.get(i);
int j;
//将为排序的元素和已排序的序列进行比较,并移动元素位置
for (j = i - d; (j >= 0) && (c.compare(list.get(j), temp) > 0); j -= d) {
list.set(j + d, list.get(j));
}
//如果标记元素不是已排序中最大的,将标记元素插入到有序序列中
if (j != (i - d)) {
list.set(j + d, temp);
}
}
}
最近看了一下所有排序算法的思想,以及他们的时间复杂度和空间复杂度。说一点自己的理解,对于任何一种排序算法,都不会在所有情况下达到最优,每种算法都有其最优的使用情况。