数据结构与算法学习笔记(三)——排序(一)

排序算法的比较点

  1. 最好、最坏、平均时间复杂度的比较
  2. 时间复杂度的常数、低阶、系数的比较
  3. 比较、交换的次数
  4. 算法的是稳定的还是非稳定的:若经过排序后,之前待排序数组的相等元素的原有的先后顺序不变,则表示排序算法是稳定的,否则非稳定排序算法
  5. 算法的内存消耗:若空间复杂度为O(1),则为原地排序

冒泡排序

  1. 原理:将相邻的两个元素进行比较,若满足大小要求,则不交换,否则就交换。若某一次冒泡中没有任何元素进行了交换,则可以结束冒泡。

  2. 特点:每一次冒泡至少会有一个元素移动到它正确的位置
    在这里插入图片描述

  3. 冒泡排序是原地排序算法且是一种稳定的排序算法。

  4. 时间复杂度:最好为O(n),最坏为O(n^2),
    平均为O(n^2)

插入排序

  1. 原理:将待排序数组分为已排序区和未排序区,一般初始已排序区为第一个元素,每次从未排序区中取一个元素x,在已排序区间内将x插入合适的位置(相当于x与已排序的区间进行大小比较),直至未排序区间的数量为0。

  2. 特点:将未排序的区间插入到已排序区间的合适位置实际和数组的数据插入类似,将已排序区间中x的正确位置后的所有元素往后移一位,再将x插入。
    在这里插入图片描述

  3. 插入排序是一种原地排序、稳定的排序算法。

  4. 时间复杂度:最好为O(n),最坏为O(n^2),
    平均为O(n^2)

选择排序

  1. 原理:将待排序数组分为已排序区间和未排序区间,每次从未排序区间中选择最小的元素x,将已排序区间中的x的待插入位置的数据进行交换。可以将初始的有序区间假设为第一个元素。

  2. 特点:选择排序和插入排序都是将数组分为已排序区间和未排序区间,但是对于插入排序是找到插入点后(已排序区间中),后移该插入点上的元素及后面的元素;而选择排序则是找到插入点后,将元素进行交换
    在这里插入图片描述

  3. 选择排序是一种原地排序、不稳定的排序算法

  4. 时间复杂度:最好、最坏、平均都为O(n^2)

归并排序

  1. 原理:利用分治思想,从中间将待排序数组分为两部分,对前后部分分别进行排序后再合成。

  2. 特点:可利用递归,递归的退出条件为划分的区间内元素个数为1。
    在这里插入图片描述

  3. 归并排序是一种稳定的、非原地排序算法(空间复杂度O(n))。关键算法在于合并算法

  4. 时间复杂度:最好、最坏、平均都为O(nlogn)

快速排序

  1. 原理:利用分治思想。将待排序数组[p,r]中选择一个分区点pivot,将比pivot大的元素放在其右边,比pivot小的元素放在其左边,再将pivot放在中间,即[p,pivot-1]为小于pivot的元素,[pivot+1,r]为大于pivot的元素,直至区间为1。

  2. 特点:分区点的选择至关重要,可以使用三点取值法:即从开头、末尾、中间取值,将三个值中的中间值作为分区点;也可以使用随机取值法,每次随机取一个值作为分区点。
    在这里插入图片描述

  3. 快速排序和归并排序的区别:快排是从上至下的,先分区(分区即排序),最后变成每个小单元;归并排序是从下至上,先拆分成单个单元后再合并(合并即排序)

  4. 快排是不稳定的原地排序算法。关键算法在于分区算法。

  5. 时间复杂度:最好为O(nlogn),最坏为O(n^2),平均为O(nlogn)

以上所有图片来源于王真——数据结构与算法之美

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值