希尔排序
2016-03-05 22:49
281 查看
希尔排序:
将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。其又称为缩小增量排序,它是是一种插入排序,是直接插入排序算法的一种威力加强版。
以下是希尔排序过程:
以下是代码:
需要注意的是:增量序列的最后一个增量值必须等于1才行。
平均时间复杂度:希尔排序的时间复杂度和其增量序列有关系,这涉及到数学上尚未解决的难题;不过在某些序列中复杂度可以为O(n1.3),最坏的情况为O(n^2),平均情况为O(nlogn)~O(n^2)
空间复杂度:O(1)
稳定性:不稳定
将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为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)
稳定性:不稳定
相关文章推荐
- C++实现简单的希尔排序Shell Sort实例
- 希尔排序的算法代码
- c语言实现冒泡排序、希尔排序等多种算法示例
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JavaScript排序算法之希尔排序的2个实例
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- java高级排序之希尔排序
- java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)
- java 中基本算法之希尔排序的实例详解
- Java排序算法总结之希尔排序
- java 数据结构基本算法希尔排序
- 算法的时间复杂度
- 第14话:如何计算算法的时间复杂度
- 基于比较的排序,时间复杂度下界是o(nlogn)的证明
- 算法的时间复杂度分析
- 求递归方式的时间复杂度【转】
- 线性表顺序存储的优缺点
- 简单实现希尔排序
- 排序算法 java版本
- 各种排序方法java实现