插入排序法 用集合来代替 数组的 递归赋值 能不能算一种优化呢?

插入排序法 用集合来代替 数组的 递归赋值 能不能算一种优化呢?

数组的插入排序法中, 可以看出,找到合适的位置i,要插入一个数据,就势必要对 [i -> data.size) 进行覆盖操作。  如果我们新建一个空的集合,把数组的元素插入到集合中去。  找到合适的位置, add(index) , 能不能算是一种优化?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
提问者 xiaobai00000 2020-09-26 18:50:33
用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()
}

  • 抱歉,因为我对 kotlin 不熟悉,所以对于你的代码中的很多细节还是不很理解,但是你的代码肯定需要额外的空间,所以不是原地排序;你的实测结果怎么样?
    2020-09-27 00:25:35
  • 提问者 xiaobai00000 回复 liuyubobobo #2
    嗯,的确不是 原地排序,需要创建一个集合。 用相同的 10w个随机数 排序测试如下: --select-sort-3-duration 17132 --insert-sort-duration 8004 (使用我提到的 创建一个集合插入) --insert-sort-2-duration 15793 (使用插入排序的, swap) --insert-sort-3-duration 4521 (使用插入排序的 赋值) --system sort---duration:50 (使用系统的 Arrays.sort()) *******start to verify******** ****** both right, checking duration: 17 性能优于swap,但是 比不上 老师提到的 赋值 的方式.
    2020-09-27 13:17:15
liuyubobobo 2020-09-26 15:54:51

其实我没有特别理解你的意思。把你的方法用代码表示出来,实际测试一下性能?

加油!:)

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师