【1】原理
梳(comb)排序基于冒泡排序。目前最为大家熟知的冒泡排序是相邻两个元素进行比较,核心思路就是调整相邻2个元素之间的位置,每进行一次内循环,就可以将最大值调整到最后,时间的复杂度为 O(n2)。
然而梳排序提出了不同的观点,每个梳都有自己的gap(间隙),或大或小。如果在冒泡排序中找到类似的说法,那就是gap = 1。
梳排序有这样一个1.3的比率值,每趟比较完后,都会用这个1.3去递减gap,直到gap=1时变成冒泡排序,这种算法比冒泡排序的效率要高效的多。原理图如下:
只需要看懂上图,就能够明白这种排序算法的原理。两个红线间的距离越来越小(gap),且该算法不是一个稳定排序。
【2】代码
import java.util.Arrays;
public class combSort {
public static int[] combSort(int[] a) {
int N = a.length;
int Step = N;
int k;
//将数组长度 ÷1.3得到本次的gap; 当step=1时,相当于最后进行了一次冒泡排序
while((Step /= 1.3) >= 1) {
for (int i = N-1; i >= Step; i--) {
k = i -Step;
//如果前者大于后者,则进行交换
if(a[k]>a[i]){
// 交换位置,
exc(a, k, i);
System.out.println("exc……");
}
System.out.println(Arrays.toString(a));
}
}
return a;
}
//自编交换函数
private static void exc(int[] a, int k, int i) {
int pool = a[k];
a[k]=a[i];
a[i]=pool;
}
public static void main(String[] args) {
int[] a = {1,3,4,5,3,8,9,6,45,23,98,2,6};
combSort(a);
}
}
运行结果:
1.3的衰减比例是在多个随机数值测试比较中得出的,在实际编程时候,除以1.3可以用乘以0.8代替,乘法毕竟比除法要快一些。
闲来无事,看看算法还是很有趣的!2021.02.08 by hash怪