最近学习了一下排序算法,写篇文章记录一下,详细讲解网上有很多,可以自己去查
希尔排序Shell Sort
希尔排序又叫缩小增量排序,是一种改进的插入排序。希尔排序是把待排序列的下标按一定的增量分组,对每组使用直接插入算法排序,随着增量的逐渐减少,每组包含的数据越来越多。当增量减至1时,整个文件被分为一组,算法便终止。希尔排序是非稳定排序。
算法描述(Java):
选取的增量公式为 d s = 2 s − 1 d_s = 2^s - 1 ds=2s−1, 1 ⩽ s ⩽ log 2 n 1 \leqslant s \leqslant \log_2 n 1⩽s⩽log2n, s ∈ Z s \in Z s∈Z
import java.util.Arrays;
public class SortAlgorithm {
public static void shellSort(int[] array) {
int[] incSeq = getIncSeq(array.length);
for (int i = 0; i < incSeq.length; ++i) {
for (int j = incSeq[i]; j < array.length; ++j) {
int d = j - incSeq[i];
while (d >= 0 && array[d] > array[d + incSeq[i]]) {
array[d + incSeq[i]] = array[d + incSeq[i]] ^ array[d];
array[d] = array[d + incSeq[i]] ^ array[d];
array[d + incSeq[i]] = array[d + incSeq[i]] ^ array[d];
d -= incSeq[i];
}
}
}
}
public static int[] getIncSeq(int n) {
int index = (int) Math.floor(Math.log(n) / Math.log(2));
int[] seq = new int[index];
for (int i = 0; i < index; ++i) {
seq[i] = (int) Math.pow(2, index - i) - 1;
}
return seq;
}
public static void main(String[] args) {
int[] array = {18,8,22,37,5,25,11,8,30};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}