十大经典排序算法(动图演示)-1之冒泡排序

分类:科技频道 时间:2024-10-22 00:00:14 浏览:2
概述
在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。最常用到的排序方式是数值顺序以及字典顺序。排序算法也用在处理文字资料以及产生人类可读的输出结果。
内容

基本上,排序算法的输出必须遵守下列两个原则:

输出结果为递增序列(递增是针对所需的排序顺序而言)

输出结果是原输入的一种排列或是重组

算法基本介绍

十种排序算法一般分为两大类:

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。(冒泡、选择、插入、归并、快速、希尔、堆排序)
  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 (计数、基数、桶)

十种排序算法复杂度一览:

  • n:数据规模
  • k:进制数量(eg:十进制 k=1)
  • d:最大值的位数
  • m:桶的数量

名词解释:

  • 稳定性:如果相等的两个元素,在排序前后的相对位置保持不变,那么这称之为稳定的排序算法
  • In-place:不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入
  • 时间复杂度:指执行算法所需要的计算工作量。也就是说程序需要执行的次数
  • 空间复杂度:对一个算法在运行过程中临时占用存储空间大小的量度

1. 冒泡排序(Bubble Sort)

冒泡排序又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误则交换两个元素,走访数列的工作是重复的进行直到没有需要交换的,也就是说该数列已经排序完成,这个算法名字的由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

1.1 算法描述

  1. 从头开始比较每一对相邻的元素,如果第一个比第二个大,就交换他们的位置
    1. 执行完一轮后,最末尾那个元素就是最大的元素
  2. 忽略(1)中曾经找到的最大元素,重复执行步骤(1),直到元素全部有序。

1.2 动图演示


1.3 代码实现

  • 方案一:

  • class BubbleSort01: BaseSort {
    override func sortAction() {
    if arrayList.count <= 1 { return }
    let end = arrayList.count
    for j in 0..<end {
    for i in 1..<end-j {
    if cmpIndex(i, i-1) < 0 {
    swap(i, i-1)
    }
    }
    }
    }
    }

    优化方案:

    思考:

    如果一次内层的for循环 执行一次之后并没有发生交换的操作,

    那么就可以证明整个数据是已经有序的了,这个时候就完全可以终止for循环。

    这种操作,在数据越接近有序的情况下越明显。

  • class BubbleSort02: BaseSort {
    override func sortAction() {
    if arrayList.count <= 1 { return }
    let end = arrayList.count
    for j in 0..<end {
    var exchanged = true
    for i in 1..<end-j {
    if cmpIndex(i, i-1) < 0 {
    swap(i, i-1)
    exchanged = false // 没有交换过 说明剩余的数据已经是有序的了
    }
    }
    if exchanged { break }
    }
    }
    }

    方案对比结果

  • var sortArray = createRandom(count: 1000, min: 0, max: 10000)
    testSorts(array: sortArray,
    BubbleSort01(),
    BubbleSort02()
    )

    结果:
    【算法.BubbleSort01】
    执行时间:0.6306749582290649 比较次数:499500 交换次数:240953
    ---------------------------------------------------------------------------------
    【算法.BubbleSort02】
    执行时间:0.6284579038619995 比较次数:498870 交换次数:240953
    ---------------------------------------------------------------------------------

    可以看到 优化后的方案 比较次数是比较少的,交换次数不变,整体时间上也略有差异。



评论
签到
购物车
客服
赚钱

入驻猿来入此平台

睡后收入不是梦想

我要赚钱
公众号

扫码关注公众号

每月领专属优惠