我们来谈一谈希尔排序:
希尔排序和直接插入排序一样属于插入排序,但是由于分组的存在,相等的元素可能分在不同组,
导致他们的次序可能发生变化,所以它是不稳定的排序。
除此之外由于它移动次数较少所以它比直接插入排序时间性能优越,效率更高。
时间复杂度:最好情况:O(n) 最坏情况:O(n2) 平均情况:O(n1.3)
空间复杂度:O(1)
希尔排序的主要思想什么?
其实它只是比直接插入排序多了个分组,那么它的主要思想是什么呢?
我的理解是首先将待排序的元素分为若干个子序列,对子序列进行直接插入排序,待整个排序序列
基本有序之后再对所有元素进行直接插入排序
写希尔排序代码之前首先我们要先确定一个增量:初始化时取序列的一半为增量,以后每次减半,直到增量为1;
代码如下:
#include <stdio.h>
void ShellSort(int par_array[], int length)
{
int i, j, h,temp;
for (h = length / 2; h > 0; h = h /2) //先按照增量 h 进行分组
{
for ( i = h; i < length; i++)
{
temp = par_array[i];
for (j = i-h; j >= 0; j -= h ) //对被分的组的元素进行直接插入排序
{
if (temp < par_array[j])
{
par_array[j + h] = par_array[j]; //满足条件将有序区的元素往后面移 增量 h 的位置
}
else
{
break;
}
}
par_array[j + h] = temp;
}
}
}
int main()
{
int i;
int a[] = {0, 3, 4, 4,1, 7, 23, 12, 2, 44};
int len = sizeof(a) / sizeof(a[0]); //求数组长度
ShellSort(a, len);
for (i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}