• 排序算法总结


    内排序:指在排序期间数据对象全部存放在内存排序;

    外排序:指大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次全部加载到内存中,需要在内存和外部存储器之间进行多次数据交换,以达到整个排序文件的目的。

    分类

    排序算法

    排序基本思想(升序)

    交换排序

    冒泡排序

    1、首先将第1个和第2个关键字比较大小,如果第1个比第2个大,则交换,再对第2个和第 3个进行比较,以此类推,重复进行上述计算,直到完成第(n-1)和第n个记录关键字进行比较;

    2、再按照上述方式进行第2次、第3次排序,直到整个序列有序为止;

    快速排序

    1、从数列中找出一个基准值

    2、将所有比基准值小的放在基准值的前面,比基准值大的放在基准值的后面;

    3、递归的把基准值前面的子数列和基准值后面的子数列进行排序

    插入排序

    简单插入排序

    1、将n个待排序的元素看成一个有序表和一个无序表;

    2、开始时有序表表只含有1个元素,无序表含有n-1个元素;

    3、每次从无序表中取出1个元素,将它插入到有序表中适当的位置,使之成为新的有序表,重复n-1次可完成排序过程;

    希尔排序(对插入排序的改进又名缩小增量排序)

    1、先取小于n的整数d1作为第一个增量,把文件的全部记录分组,所有距离为d1的倍数分为一组,对每组进行直接插入排序;

    2、取第2个增量d2<d1,重复上述的分组和排序,直至增量dt = 1,即所有记录放在同一组中进行直接插入排序;

    选择排序

    简单选择排序

    1、从n个待排序列中选出最小的一个放在序列的起始位置;

    2、然后从剩余未排序中找出最小的元素,放在已排序序列的末尾;

    3、以此为推,直到所有待排序列的元素为零;

    堆排序(完全二叉树的结构)

    大顶堆: 每个结点的值都大于或等于其子结点的值;(升序排序)

    小顶堆:每个结点的值小于或等于其子结点的值;(降序排序)

    1、将待排序列构造成一个大顶堆;

    2、将顶端的数有末尾的数交换,此时末尾的树为最大数;

    3、将剩余的n-1个数构造成大顶堆,再将顶端树与n-1位置的数交换,如此反复的执行;

    归并排序

    (分治算法:将一个大的问题划分为n个规模较小而结构相似的子问题)

    二路归并

    二路归并排序的宗旨:”分解”与归并

    1、分解:

       A将一个数组分成两个数组,分别对两个数组进行排序;

       B循环第一步,直到划分出来的小数组只包含一个元素,只有一个元素的数组默认已经排好序;

    2、归并:

       A将两个有序的数组合并到一个大的数组中

       B从最小的只包含一个元素的数组开始两两合并;

    多路归并排序

    1、按可用内存的大小,将大文件拆分为M个子文件;

    2、使用内部排序分别对M个子文件进行排序;

    3、创建M个优先队列,每个队列从对应的文件中读取TOPN个元素;

    4、从M个队列中各选择一个数进入中转优先队列,并将数字打上对应队列的标记, 中转站队列出来的最小数字就是要排序的数字之一,同时通知对应编号的队列继续出数字进入中转队列;

    5、中转站一直保存着M个数字,当中转站中所有的数都出队列则排序结束。

     

  • 相关阅读:
    [转]Intellij IDEA快捷键与使用小技巧
    Swoole来实现实时异步任务队列
    php 异步执行脚本
    Centos 7 systemctl和防火墙firewalld命令
    tgz的解压
    error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法
    Linux 命令详解(三)./configure、make、make install 命令
    LNMP, CentOS7.0+Nginx+Mysql5.7+PHP7环境安装
    phpmailer使用qq邮箱、163邮箱成功发送邮件实例代码
    Mibew Messenger (also known as Open Web Messenger)
  • 原文地址:https://www.cnblogs.com/dingou/p/11502491.html
Copyright © 2020-2023  润新知