前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《图解算法》第2章 选择排序

《图解算法》第2章 选择排序

作者头像
yeedomliu
发布2020-08-10 15:42:03
3500
发布2020-08-10 15:42:03
举报
文章被收录于专栏:yeedomliuyeedomliuyeedomliu

第2章 选择排序

数组是个重要的主题,一定要高度重视!很多算法仅在数据经过排序后才管用

内存工作原理

  • 需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的差别很重要

数组和链表

有时候,需要在内存中存储一系列元素。假设你要编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中 使用数组意味着所有待办事项在内存中都是相连的。现在假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西!你需要重新请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里

  • 一种解决之道是“预留座位”:即使当前只有3个待办事项,也请计算机提供10个位置,以防需要添加待办事项。它存在两个缺点
  1. 你额外请求的位置可能根本用不上,这将浪费内存。你没有使用,别人也用不了
  2. 待办事项超过10个后,你还得转移

链表

  • 链表中的元素可存储在内存的任何地方
  • 链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起
  • 只要有足够的内存空间,就能为链表分配内存

数组

  • 需要同时读取所有元素时,链表的效率很高:你读取第一个元素,根据其中的地址再读取第二个元素,以此类推。但如果你需要跳跃,链表的效率真的很低
  • 需要阳春面地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素

术语

元素的位置称为索引 数组和链表操作的运行时间

在中间插入

  • 使用链表时,插入元素很简单,只需修改它前面的那个元素指向的地址
  • 使用数组时,则必须将后面的元素都向后移。如果没有足够的空间,可能还得将整个数组复制到其他地方!因此,当需要在中间插入元素时,链表是更好的选择

删除

  • 链表也是更好的选择,因为只需修改前一个元素指向的地址即可
  • 使用数组时,删除元素后,必须将后面的元素都向前移
  • 不同于插入,删除元素总能成功。如果内存中没有足够的空间,插入操作可能失败,但在任何情况下都能够将元素删除
  • 数组和链表操作的运行时间
  • 数组用得很多,因为它支持随机访问。有两种访问方式
  1. 随机访问:
  2. 顺序访问:从第一个元素开始逐个读取元素;链表只能顺序访问,要读取链表第十个元素,得先读取前九个元素,并沿链接找到第十个元素

假设Facebook使用的是一种混合数据:链表数组。这个数组包含26个元素,每个元素都指向一个链表。这种新数据结构的查找和插入速度更快还是更慢?

选择排序

  • 选择排序是一种灵巧的算法,但其速度不是很快。快速排序是一种更快的排序算法,其运行时间为O(n log n)
class SelectionSort
{

    public static function sort($array) {
        $length = count($array);
        foreach ($array as $outerIndex => $item) {
            $minIndex = $outerIndex;
            for ($innerIndex = $outerIndex + 1; $innerIndex < $length; $innerIndex ++) {
                if ($array[ $minIndex ] > $array[ $innerIndex ]) {
                    $minIndex = $innerIndex;
                }
            }
            $temp = $array[ $outerIndex ];
            $array[ $outerIndex ] = $array[ $minIndex ];
            $array[ $minIndex ] = $temp;
        }

        return $array;
    }

}

$array = [5, 3, 6, 2, 10];
echo join(SelectionSort::sort($array), ',') . PHP_EOL;

// 输出:2,3,5,6,10
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yeedomliu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第2章 选择排序
    • 内存工作原理
      • 数组和链表
        • 链表
        • 数组
        • 术语
        • 在中间插入
        • 删除
      • 选择排序
      相关产品与服务
      数据保险箱
      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档