最近重学了一下java,知道了一个新的排序算法叫希尔排序,于是乎去简单了解了一下希尔排序,希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本。 在学习过程中,我看到了不同的两种写法,今天就这两种写法做一个对比:
写法一:
先进行希尔排序,然后进行插入排序
int step = array.length,t;
//确定步长
while((step = step/2)>=2){
for (int i = 0; i+step < N; i++) {
if(array[i]>array[i+step]){
t = array[i];
array[i] = array[i+step];
array[i+step] = t;
}
}
}
//插入
for (int i = 1,j; i <= N-1 ; i++) {
if(array[i]>=array[i-1]){
continue;
}
t = array[i];
//找到第一个比t小的元素的下标j,j+1就应该是t插入的位置
//遇到大的就后移
for (j = i-1 ; j >= 0 && array[j]>t ; j--) {
array[j+1] = array[j];
}
//插入
array[j+1] = t;
}
写法二:
在希尔排序的同时进行插入排序
int step = array.length,t;
while ((step /= 2) > 0) {
for (int i = step; i < N; i++) {
t = array[i];
int j = i - step;
while (j >= 0 && array[j] > t) {
array[j + step] = array[j];
j -= step;
}
array[j + step] = t;
}
}
排序用时比较:
数据量 | 写法1 | 写法2 |
---|---|---|
一万 | 0.007s | 0.004s |
十万 | 0.107s | 0.01s |
百万 | 11.06s | 0.142s |
千万 | 时间过长 | 1.771s |
在数据量少的时候,两种写法执行速度相差不明显,但数据量增加后,很明显第二种写法效率更高,且代码量也更少!