插入排序法 用集合来代替 数组的 递归赋值 能不能算一种优化呢?
来源:2-2 实现插入排序法
xiaobai00000
2020-09-26 15:10:28
数组的插入排序法中, 可以看出,找到合适的位置i,要插入一个数据,就势必要对 [i -> data.size) 进行覆盖操作。 如果我们新建一个空的集合,把数组的元素插入到集合中去。 找到合适的位置, add(index) , 能不能算是一种优化?
2回答
xiaobai00000
提问者
2020-09-26
用kotlin写的, 老师 看下 思路有没有问题。 主要是想解决 在选择排序中,数组插入元素时,之后的元素 都得右移的问题。
fun sortInsert(data1: Array<Int>): Array<Int> { //采用降序排列
var data = Array<Int>(data1.size) { data1[it] }
var time = System.currentTimeMillis()
if (data.isEmpty()) {
e("--empty array---")
return data
}
var baseValue = data[0] //设置原点,每个要插入的数据 均和比较来 判断 是插入到它左边 还是 右边
var baseIndex = 0
var resultArray = ArrayList<Int>()
resultArray.add(baseValue) //先将第一个元素 加入空集合中
var tempValue = 0
for (i in 1 until data.size) { //从第二个元素开始,一个个的参与 比较 最后 添加到集合中
tempValue = data[i] //将要插入的第i个元素
if (tempValue >= baseValue) { //比原点大,所以 插入到左边 (因为是降序)
if (baseIndex == 0) { //如果原点已经是头部了, 直接加到集合的 0 位置
resultArray.add(0, tempValue)
baseIndex++
continue
}
for (j in (baseIndex - 1) downTo 0) {
if (tempValue < resultArray[j]) {
resultArray.add(j + 1, tempValue)
baseIndex++
break
}
if (j == 0) {
resultArray.add(0, tempValue)
baseIndex++
}
}
} else {
if (baseIndex == resultArray.size - 1) {
resultArray.add(tempValue)
continue
}
for (j in (baseIndex + 1) until resultArray.size) {
if (tempValue > resultArray[j]) {
resultArray.add(j, tempValue)
break
}
if (j == resultArray.size - 1) {
resultArray.add(tempValue)
}
}
}
}
e("--insert-sort-duration ${System.currentTimeMillis() - time}")
return resultArray.toTypedArray()
}
liuyubobobo
2020-09-26
其实我没有特别理解你的意思。把你的方法用代码表示出来,实际测试一下性能?
加油!:)
相似问题