Class PHA.YX.Arithmetic.CountSort Extends %RegisteredObject
{
Method sort(array As PHA.YX.Arithmetic.Array)
{
/* 1.得到数列的最大值 */
#dim max as %Integer = array.get(0)for i = 1 : 1 : (array.length() - 1) {
if (array.get(i) > max){
s max = array.get(i)
}
}
/* 2.根据数列最大值确定统计数组的长度 */
#dim countArray as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d countArray.init(max + 1)
/* 3.遍历数列,填充统计数组 */
for i = 0 : 1 : (array.length() - 1) {
if (countArray.get(array.get(i)) = ""){
d countArray.set(array.get(i), 0)
}else{
d countArray.set(array.get(i), (+countArray.get(array.get(i)) + 1))
}
}
b ;countArray
/* 4.遍历统计数组,输出结果 */
#dim index as %Integer = 0#dim sortedArray as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d sortedArray.init(array.length())
for i = 0 : 1 : (countArray.length() - 1) {
for j = 0 : 1 : (countArray.get(i) ){
d sortedArray.set(index, i)
s index = index + 1
}
}
b ;sortedArray
q sortedArray
}
}
调用
/// w ##class(PHA.YX.Arithmetic).CountSort()
ClassMethod CountSort()
{
#dim array as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d array.init(13)
d array.insert(0,4)
d array.insert(1,4)
d array.insert(2,6)
d array.insert(3,5)
d array.insert(4,3)
d array.insert(5,2)
d array.insert(6,8)
d array.insert(7,1)
d array.insert(8,7)
d array.insert(9,5)
d array.insert(10,6)
d array.insert(11,0)
d array.insert(12,10)
#dim countSort as PHA.YX.Arithmetic.CountSort = ##class(PHA.YX.Arithmetic.CountSort).%New()
s array = countSort.sort(array)
d array.output()
q ""
}
Method optimizeSort(array As PHA.YX.Arithmetic.Array)
{
/* 1.得到数列的最大值和最小值,并算出差值d */
#dim max as %Integer = array.get(0)#dim min as %Integer = array.get(0)for i = 1 : 1 : (array.length() - 1) {
if (array.get(i) > max){
s max = array.get(i)
}
if (array.get(i) < min){
s min = array.get(i)
}
}
#dim d as %Integer = max - min
/* 2.创建统计数组并统计对应元素个数 */
#dim countArray as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d countArray.init(d + 1)
for i = 0 : 1 : (array.length() - 1) {
if (countArray.get((array.get(i)- min)) = ""){
d countArray.set((array.get(i) - min), 1)
}else{
d countArray.set((array.get(i) - min), (+countArray.get((array.get(i) - min)) + 1))
}
}
b ;2 countArray
/* 3.统计数组做变形,后面的元素等于前面的元素之和 */
for i = 1 : 1 : countArray.length - 1 {
d countArray.set(i , (countArray.get(i) + countArray.get(i - 1)))
}
b ;3 countArray
/* 4.倒序遍历原始数列,从统计数组找到正确位置,输出到结果数组 */
#dim sortedArray as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d sortedArray.init(array.length())
for i = (countArray.length() - 1) : -1 : 0 {
s arrayMin = array.get(i) - min
s countMin = countArray.get(arrayMin) - 1
d sortedArray.set(countMin, array.get(i))
d countArray.set(arrayMin, countMin)
}
b ;sortedArray
q sortedArray
}
调用
/// w ##class(PHA.YX.Arithmetic).OptimizeCountSort()
ClassMethod OptimizeCountSort()
{
#dim array as PHA.YX.Arithmetic.Array = ##class(PHA.YX.Arithmetic.Array).%New()
d array.init(10)
d array.insert(0,95)
d array.insert(1,94)
d array.insert(2,91)
d array.insert(3,98)
d array.insert(4,99)
d array.insert(5,90)
d array.insert(6,99)
d array.insert(7,93)
d array.insert(8,91)
d array.insert(9,92)
#dim countSort as PHA.YX.Arithmetic.CountSort = ##class(PHA.YX.Arithmetic.CountSort).%New()
s array = countSort.optimizeSort(array)
d array.output()
q ""
}