第十九章 Caché 算法与数据结构 插入排序
基本思想
把n个待排序的元素看成一个有序表和一个无需表,开始的时候有序表只有1个元素,无序表中有n-1个元素
每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。
时间复杂度
- O(n^2)
步骤
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。

完整代码
插入类
Class PHA.YX.Arithmetic.InsertSort Extends %RegisteredObject
{
Method sort(array As PHA.YX.Arithmetic.Array)
{
#dim j as %Integer = 0
/* 临时变量 */
#dim temp as %Integer = 0
/* 从第二数开始比较 */
for i = 1 : 1 : array.length - 1 {
/* 将当前数插入到已经有序的数组中 */
s temp = array.get(i)
#dim flag as %Boolean = ?$NO
s j = i - 1
while(j > -1){
/* 如果前面的数大于当前数,将他后移 */
if (array.get(j) > temp){
d array.set(j + 1, array.get(j))
}else{
quit
}
s j = j -1
}
/* 将当前轮数的数放到应该在的位置 */
d array.set(j + 1 , temp)
}
q array
}
}
调用
/// w ##class(PHA.YX.Arithmetic).InsertSort()
ClassMethod InsertSort()
{
#dim array as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d array.init(8)
d array.insert(0,52)
d array.insert(1,63)
d array.insert(2,14)
d array.insert(3,59)
d array.insert(4,68)
d array.insert(5,35)
d array.insert(6,67)
d array.insert(7,99)
#dim sort as PHA.YX.Arithmetic.InsertSort = ##class(PHA.YX.Arithmetic.InsertSort).%New()
s array = sort.sort(array)
d array.output()
q ""
}
DHC-APP>w ##class(PHA.YX.Arithmetic).InsertSort()
14
35
52
59
63
67
68
99