数据结构——排序算法
排序算法中需掌握重点:
1、对每个排序算法过程,时间复杂度,空间复杂度了解;
2、对重要排序算法能实现代码;
3、对于特定序列,选择比较合适的排序算法
常用内排序算法分类:插入排序(直接插入、折半插入、希尔排序),选择排序(简单选择排序、堆排序),交换排序(冒泡、快速排序),归并排序,基数排序。
外排序算法:多路归并排序
1.插入排序
- 直接插入
- 对于排序序列,直接插入排序主要思想为:从第二个数开始,每次与前面的数比较,从而插入到它合适的位置去。如从小到大排序方法:每次值与前面的数比较,如果比它小,则交换位置。因此,直接插入排序算法每次都无法确定值的最终位置,但算法是稳定的。注意,直接插入排序适用于顺序存储和链式存储的线性表
- 对于一组序列,实现算法流程如下:(1)用2个for循环,第一层外循环每次后移一位,第二层for循环从上一层位置开始,依次往前移动比较大小。(2)时间复杂度为o(n2),空间复杂度为常量O(1)。(3)最好状态为全部有序,最差状态为逆序。
- 对于排序序列,直接插入排序主要思想为:从第二个数开始,每次与前面的数比较,从而插入到它合适的位置去。如从小到大排序方法:每次值与前面的数比较,如果比它小,则交换位置。因此,直接插入排序算法每次都无法确定值的最终位置,但算法是稳定的。注意,直接插入排序适用于顺序存储和链式存储的线性表
- 折半插入
- 对于折半插入,则是使用了二分查找的思想,将比较和移动操作抽离出来。比较还是依次比较,但是对于插入的位置,使用二分查找来进行。因此,主要过程为:当前值依次与前面的值,通过二分查找,找到对应应该插入的位置。
- 对于一组序列,算法实现流程如下:(1)用2个for循环,外层的for循环来依次移动位置,然后移动位置前面开始使用二分查找,找到合适的位置,再使用内存的for循环来进行移动。这样的话,比较和移动抽离出来,使得比较次数变少。(2)比较次数时间复杂度为O(nlog2n),但移动次数未变,还是O(n2),空间复杂度为O(1)。(3)最好状态,最差状态与直接插入一样
- 对于折半插入,则是使用了二分查找的思想,将比较和移动操作抽离出来。比较还是依次比较,但是对于插入的位置,使用二分查找来进行。因此,主要过程为:当前值依次与前面的值,通过二分查找,找到对应应该插入的位置。
- 希尔排序(易忘记)
- 对于希尔排序,实际上是一组分组插入的方法,又称为缩小增量插入排序。将带排序序列分为L[i,i+d,i+2d,...j+kd],每次分组比较进行插入排序,再对整体的进行排序。过程如下图所示。算法不稳定,仅使用与顺序存储情况。
- 对于一组序列,算法实现流程如下:(1)总共有3个循环,第一层循环为每次间隔值的变化。一般是除以2,以2为间隔基数。每次划分分组。然后,第二层循环则为找到当前值。第三层则为找到与当前值在同一个分组的值进行直接插入排序的比较。一层循环while(gap>0);二层循环 for(i = gap;i++;i<n);第三层循环则是while(j>0&&tmp<R[j])。(2)由于使用了常数个辅助单元,因此,空间复杂度为O(1)。时间效率O(n1.3),最坏为O(n2)。
![]()
- 对于希尔排序,实际上是一组分组插入的方法,又称为缩小增量插入排序。将带排序序列分为L[i,i+d,i+2d,...j+kd],每次分组比较进行插入排序,再对整体的进行排序。过程如下图所示。算法不稳定,仅使用与顺序存储情况。
2.


浙公网安备 33010602011771号