第十七章 Caché 算法与数据结构 希尔排序

文章目录

第十七章 Caché 算法与数据结构 希尔排序

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wz5pN1G6-1592773713372)(A7012EBF9B9B41D0B71B1FADE9D2EE19)]

时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n2)
  • 不稳定

image

完整示例

排序类

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
 

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/106894653
今日推荐