最近想看看算法的,都是之前看的,有点都忘记了。
快速排序
步骤:
从数列中跳出一个元素,称为“基准”。
重新排序数列,所有元素比基准值小的摆放在基准前面,该基准就处于数列的中间位置。这个称为分区操作。
归并排序
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。设定两个指针,最初位置分别为两个已经排序序列的起始位置,比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3知道某一指针达到序列为,将另一序列剩下的所有元素直接复制到合并序列尾。
我的理解归并算法最大的优势,就是之前已经排列好的列项,不再进行排序,从而节约了很多比较。
堆排序
我们可以吧叶子节点当作堆,在叶子节点的基础上添加非叶子节点,并调整,过程与调整堆一样,这里要注意数组下标是从0开始,所以节点的左右子及诶单下标分别为2*i+1,2*i+2。并且第一个非叶子节点下标为len/2-1.
调整堆:原数组建好后,将堆定元素A[0]与堆中最后一个元素A[n-1]交换位置,在调整A[0,1,2…n-2]为最大堆。
重复第二步,知道还剩下一个元素为止,此时A[0,1,2….]便是从小到大排好序的数组了,并请没有占用额外空间。
我的理解 主要是利用到了二叉树的方式,将最大值放到堆顶端,然后进行切换,从而完成排序。
选择排序
首先在末尾序列找那个找到最小元素,存放到排列序列的起始位置,然后,再从剩余排列元素中继续寻找最小元素,然后放到排序序列末尾。
我的理解 没有什么难度,就是一个个比较,但是我觉得比较费时间的比较。
冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一队到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。
我的理解 其实和选择排序差不多,不同的是,他是仅在当前循环中进行比较,通过多次比较来进行排序,其实只是为了确定每次排行的第一个值是有序的。
插入排序
从第一个元素开始,该元素可以认为已经被排序去除下一个元素,在已经排序的元素序列中从后向前扫描,如果该元素大于新元素,将该元素移到下一位置,重复步骤3,直到找到已排序的元素小鱼或者等于新元素的位置,将新元素插入该位置中。
我的理解 插入排序,就是从最后一个插入,一个个比较,当确认不要再迁移的,就是插入后面一个元素。
希尔排序
希尔排序,也成递减增量排序算法,是插入排序的一种告诉而稳定的改进版本
1 插入排序在堆几乎已经排好序的数据操作是,效率高,即可以达到现象排序的效率
2 但插入排序一般来说是低效的,因为插入排序每次只能讲数据移动一位。