第十七章 Caché 算法与数据结构 希尔排序
希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
时间复杂度
- 最优时间复杂度:根据步长序列的不同而不同
- 最坏时间复杂度:O(n2)
- 不稳定
完整示例
排序类
Class PHA.YX.Arithmetic.ShellSort Extends %RegisteredObject
{
/**
* 希尔排序
* 希尔排序也是利用插入排序的思想来排序。
* 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。
* 这样可以让一个元素可以一次性地朝最终位置前进一大步。
* 然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,
* 但是到了这步,需排序的数据几乎是已排好的了,插入效率比较高。
* @param arr 待排序数组
*/
Method sort(array As PHA.YX.Arithmetic.Array)
{
#dim n as %Integer = array.length()
#dim gap as %Integer = n \ 2
while(gap > 0){
for j = gap : 1 : n - 1 {
#dim i as %Integer = j
while ((i >= gap) && (array.get(i - gap) > array.get(i))){
#dim temp as %Integer = array.get(i - gap) + array.get(i)
d array.set(i - gap, (temp - array.get(i - gap)))
d array.set(i, (temp - array.get(i - gap)))
s i = i - gap
}
}
s gap = gap \ 2
}
q array
}
}
调用
/// w ##class(PHA.YX.Arithmetic).ShellSort()
ClassMethod ShellSort()
{
#dim array as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d array.init(8)
d array.insert(0,2)
d array.insert(1,3)
d array.insert(2,5)
d array.insert(3,1)
d array.insert(4,23)
d array.insert(5,6)
d array.insert(6,78)
d array.insert(7,34)
#dim shellSort as PHA.YX.Arithmetic.ShellSort = ##class(PHA.YX.Arithmetic.ShellSort).%New()
s array = shellSort.sort(array)
d array.output()
q ""
}
DHC-APP 5e1>w ##class(PHA.YX.Arithmetic).ShellSort()
1
2
3
5
6
23
34
78