希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
基本思想
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
如下图:
c++版
void ShellSort(int *array,int size)
{
if (array == NULL || size < 0)
return;
int gap = size;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int idx = gap; idx < size; ++idx)
{
int end = idx - gap;
int temp = array[idx];
while (end >= 0 && array[end] > temp)
{
array[end + gap] = array[end];
end -= gap;
}
array[end+gap] = temp;
}
}
for (int i = 0; i < 6; ++i)
{
cout << array[i] << " ";
}
cout << endl;
}
shell脚本版
#!/bin/bash
echo "shellsort"
function shellsort()
{
arr=(1 3 4 0 5 2 7 8)
len=${#arr[*]}
gap=$len
while [ $gap -gt 1 ]
do
let gap=gap/3+1
for((idx=gap;idx<len;idx++))
do
let end=idx-gap
let temp=arr[idx]
let save=${arr[$end]}
while [ $end -ge 0 -a $save -gt $temp ]
do
let arr[end+gap]=arr[end]
let end-=gap
if [ $end -ge 0 ];then
let save=arr[end]
fi
done
let arr[end+gap]=temp
done
done
echo ${arr[*]}
}
shellsort