您的位置:首页 > 其它

希尔排序

2016-03-05 22:49 281 查看
希尔排序:

将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。其又称为缩小增量排序,它是是一种插入排序,是直接插入排序算法的一种威力加强版。

以下是希尔排序过程:





以下是代码:

/************************************************************************/
/* 希尔排序                                                                     */
/************************************************************************/
void ShellSort(int array[], int n){
int increment;
int i, j;
int temp;
for (increment = n / 2; increment > 0;increment/=2)  //增量递减
{
for (i = increment; i < n;i++)  //从增量开始
{
temp = array[i];
for (j = i; j >= increment;j-=increment) //每次减去一增量
{
if (temp<array[j-increment])   //小于相隔增量后面的数,进行交换
{
array[j] = array[j - increment];
}
else{
break;//跳出循环
}
}
array[j] = temp;    //赋值
}
}
}


需要注意的是:增量序列的最后一个增量值必须等于1才行。
平均时间复杂度:希尔排序的时间复杂度和其增量序列有关系,这涉及到数学上尚未解决的难题;不过在某些序列中复杂度可以为O(n1.3),最坏的情况为O(n^2),平均情况为O(nlogn)~O(n^2)
空间复杂度:O(1)  
稳定性:不稳定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息