一、希尔排序
插入排序一个很明显的缺点是插入元素时需要与已经排序的元素进行对比,对比的次数可能会比较多,考虑最坏的情况,如果原始的数组是倒序的,每插入一个元素时都要跟所有已经排好序的元素进行对比,算法的效率很低。
但是如果插入元素时对比的次数较少,能够大大提高算法的效率,希尔排序就是通过将元素数组划分为若干小组,然后对各个小组进行插入排序来减低元素之间对比的次数,提高排序的效率。
希尔排序首先选择一个元素选择步长将数组划分为若干小组,对各个小组分别进行排序,然后不断将步长缩小,不断分组和排序,直到后的步长为1,对所有的元素进行排序,此时,经过前期的排序工作,能够减少全体元素插入排序的对比次数,大大降低了排序的时间复杂度。
从网上找来图:图片地址,写的挺好
二、代码示例
1、当step > 2 时,可以自由的选择步长
/* step > 2 */
int shell_sort(int *array, int length, int step)
{
int i, j, tmp;
int gap = length;
if (NULL == array || step < 2)
return -1;
if (length == 0 || length == 1)
return 0;
while (gap > 1) {
gap = gap / step + 1;
for (i = gap; i < length; i += gap) {
tmp = array[i];
for (j = i - gap; j >= 0; j -= gap) {
if (array[j] > tmp)
array[j + gap] = array[j];
else
break;
}
array[j + gap] = tmp;
}
}
return 0;
}
2、当step = 2 时:
/* step > 2 */
int shell_sort(int *array, int length)
{
int i, j, tmp;
int gap = length;
if (NULL == array || step < 2)
return -1;
if (length == 0 || length == 1)
return 0;
while (gap > 1) {
gap = gap / 2;
for (i = gap; i < length; i += gap) {
tmp = array[i];
for (j = i - gap; j >= 0; j -= gap) {
if (array[j] > tmp)
array[j + gap] = array[j];
else
break;
}
array[j + gap] = tmp;
}
}
return 0;
}
希尔排序就到这里了,下一章介绍快速排序。
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享