希尔排序也属于插入排序。
希尔排序的基本思想是:把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小;当完成了所有数据元素都在同一个组内的排序后排序过程结束。希尔排序又称作缩小增量排序。
希尔排序是在分组概念上的直接插入排序,即在不断缩小组的个数时把原来各小组的数据元素插入到新组的合适位置上。
希尔排序是一种不稳定的排序算法。
希尔排序的过程图解:
下面的例子每次增量取上次的一半,第一次取数组长度的一半。
下面给出代码示例:
void shellSort(int data[], int size)
{
//span为步长
for (int span = size / 2; span > 0; span /= 2)
{
for (int group = 0; group < span; group++)
{
//对每一个组内采用直接插入排序
int i, j;
int temp;
//组内是直接插入排序,区别是每次不是增1而是增span
for (i = group; i < size - span; i += span)
{
temp = data[i + span];
j = i;
while (j > -1 && data[j] > temp)
{
data[j + span] = data[j];
j -= span;
}
data[j + span] = temp;
}
}
}
}