初级排序算法

  • 选择排序:首先找到数组中最小的那个元素,其次将它和数组第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换。

  • 插入排序:遍历数组(原址排序),将每一个数插入到之前排序好了的部分数组中的适当的位置,并将从 要插入的位置的右边 到 当前遍历到的位置 之间的数右移一位(参考以下例子)(具体实现是将遍历到的数 与 左边(左边部分数组已经是有序的)的数进行比较 如果不符合顺序就交换,如果符合就到达了适当的位置)

    • 具体例子:图表演示


      图片.png
  • 希尔排序(改进的插入排序算法, 将移动间隔增加为一个比较大的数, 用1,4,13,40.... 3n + 1, 中较大的一个数, 然后递减为递增数组中较小的一个数,直至为1)

    • 例子(暂无)
  • 归并排序

    • 自顶向下排序
      (加粗表示当前操作的部分)
      图片.png
    • 自下向上排序
      加粗表示当前操作部分
      图片.png
    • 归并排序的一些改进建议:
      • 对于已经足够小的数组, 用别的排序方法(例如选择排序), 有助于提高算法性能
      • 测试数组是否有序, 即测试要归并的两个数组的 前一个数组的最后一个小于后一个数组的最前一个.
    • 不将元素复制到辅助数组, 而是通过归并排序到一个新的数组,然后再归并排序回来原来的数组(如此来回切换), 来使得复制数组的花销变小.
  • 快速排序

    • 基本思想:
      • 先使数组大致有序, 然后对小数组继续递归使用 大致排序 ,直到最后剩下一个元素
    • 第一种实现: 从数组往右遍历,如果遇到比要对比的数小或者等于的数, 较小数组index_1+1,遍历数组的index_0暂时不变,然后交换 arr[index_1]、arr[index_0] 。index_0再+1。如果遇到比要对比的数大的数,index_0 + 1, index_1 不变。直到遍历完数组,最后交换arr[0]、arr[index_1]
    • 第二种实现:从数组往右遍历,直到遇到比要对比的数大的数停止,当前下标 index_0,然后从右往左遍历数组,直到遇到比要对比的数小的数停止,当前下标index_1,交换arr[index_0]、arr[index_1]。直到index_0>=index_1,最后交换arr[index_1]、arr[0]
    • 快速排序的几个注意点
    • 原地切分
    • 别越界(如果要切分的元素是数组中最大的或者最小的,别让下标跑到数组外面)
    • 保存随机性
    • 终止循环的确定性
    • 处理重复值情况
    • 终止递归
    • 提高性能的一些常用建议
    • 对于小规模数组,使用其他排序方法
    • 对于重复元素特别多情况,可以采用三切法,将元素分为小于、等于、大于三部分
  • 优先队列--基于堆数据结构

    • 堆数据结构的特点
      * 使用数组实现即可,不使用第一个位置 arr[0], 基于完全二叉树
    • 维护堆的特性:
      • 上升:一个堆底的元素,上升,直到遇到一个比他大的父元素
      • 下沉:一个堆顶的元素,下沉(和较大的子节点交换),直到遇到两个比他小的子节点
    • 实现优先队列的两个关键操作
      • 插入一个元素: 将新元素放置堆的末尾, 然后使用上升将该元素放置适合的位置
      • 删除一个元素: 将堆顶的元素删除,然后将堆末尾的元素放置堆顶, 然后使用下沉, 将该元素放置适合的位置
    • 使用堆进行排序--堆排序
  • 排序的思考

    • 将各种数据排序(通过引用)
    • 如何选择排序算法
  • 几个注意的地方:

    • 多叉堆
    • 适当加入调整数组大小的逻辑, 以防止出现下标溢出
    • 元素不可变性: 保证元素放入堆后, 无法改变其值
    • 通过使用索引(比如Integer类型), 快速对元素进行操作(虽然会花费额外的空间).但是只对索引进行操作,不管插入. 删除. 交换. 等速度会快很多
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 参考:十大经典排序算法 0、排序算法说明 0.1排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明...
    谁在烽烟彼岸阅读 1,013评论 0 12
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 662评论 0 0
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,192评论 0 4
  • “遥知兄弟登高处,遍插茱萸少一人。”千年前,关于云台,王维提过这首诗。我想,若不是这首脍炙人口的诗句,如我这般...
    知礼知礼阅读 284评论 0 0
  • 人丑就得多读书,最近不得不承认,我也得多读书,读书就得多总结,不然会忘。 今天是Christmas Eve(写完估...
    t2othick阅读 1,081评论 0 7