Scala练习-排序算法总结

之前用Scala实现了9个排序算法,后续有时间凑个10大。

源码已经全部上传到github

  • 冒泡:外层控制遍历轮次i,内层负责交换数据,使最大的上浮到size-1-i的位置
  • 快排:以第一个数为标准,小于等于到放在左边数组,大于的放到右边数组,递归归类左右两边数组,直至数组中的个数为1,收网
  • 归并:先写出合并2个有序数组的方法,然后采用2分法,切分数组成2个新数组,迭代分支各个子数组,直到子数组个数1,可认为是有序的。排序好子数组后,再合并,收网。
  • 桶:
    思想很新颖,排序也很快,但是你想打印输出出来的话,也很费劲啊。该排序适合知道数据范围的,因为他需要指定大小的桶来存放数据,数据值就是表示桶中索引,存在一个,该处的索引对应的值加1。
  • 基数:基于10字桶排序,需要用到二维数组。但是不是以值作为索引,而是以值的各个位上的值作为索引,所以数组中最大值有几位,就要进行几次划分。代码量比较大,后期需要优化下。
  • 插入:把数组分为2个子数组A和B,A含有数组第一个元素,B含有除第一个元素外的所有元素,遍历第二个数组中元素,依次插入到第一个数组中,插入的时候要根据大小找到插入的位置,适当的调整A数组中其他元素的位置(后移)。直到B中的所有元素都插入到A
  • 选择:依次选择数组中最小(或最大)的元素,于第一个位置的元素交换。然后再把剩下的元素当成一个子数组,继续第一次的操作。直到子数组的元素为1结束。
  • 希尔:利用插入排序的一种算法,用步长切分数组为一个一个小数组,小数组采用插入排序获得有序。步长step的设定一般是以数组长度/2,后续依次用step/2,直到step=0,结束轮循。
  • 堆:利用最大堆/最小堆的特性,来选择第一个索引的数,然后将剩下的元素,再变成符合最大堆/最小堆的结果,再获取第一个索引的数。重点要理解堆结构,需要写出把普通数组转换为符合堆结构的方法,生下来的就是不断取第一个数输出,剩下来的数组成子数组,再变成对结构。直到剩下来数组长度为1结束。

其时间复杂度对比如下图(盗图)

这里写图片描述

你可能感兴趣的:(算法与数据结构,LeetCode)