博客
关于我
内部排序(一)直接插入排序和二分插入排序
阅读量:344 次
发布时间:2019-03-03

本文共 1710 字,大约阅读时间需要 5 分钟。

我们都知道,程序是数据结构与算法的结合。数据结构与算法的关系密不可分,不同的数据结构配合不同的算法会产生不同的效率。排序算法是程序设计中最常用的算法之一,主要用于将数据按照一定规则重新排列。例如,在构建二叉搜索树的过程中,插入节点时也会进行类似的排序操作(左子树小于父节点,右子树大于父节点)。排序的重要性体现在以下几个方面:在无序数据集合中进行查找时,只能采用线性查找方法,平均查找长度为(n+1)/2;而对有序数据集合采用折半查找法时,平均查找长度可以降低至((n+1)/n)*log(2n+1)-1(当n较大时,约等于log(2n+1))。这表明排序操作在提升查找效率方面具有重要意义。

内部排序是指待排序数据可以一次性导入内存中进行处理。这种排序方式在内存充足的情况下可以一次完成排序操作。这类排序算法的时间复杂度通常为O(N log N)。

排序算法的稳定性指的是:对于任意两个相等的数据元素,在排序前后它们的相对位置是否保持不变。例如,在学生信息数据库中,若有两个学生名字相同但编号不同(如A1和A2),如果排序前A1在A2的前面,排序后仍然保持这一顺序,则该排序算法是稳定的;否则,该算法是不稳定的。

以下是对直接插入排序的实现分析。直接插入排序的基本思想是:将数据分为已排序部分与待排序部分。从已排序部分开始,从后往前遍历,依次将待排序部分的元素插入到已排序部分的正确位置。以下是具体实现步骤:

  • 将数据的第一个元素视为已排序部分的第一个元素。
  • 从数据的第二个元素开始,依次将每个元素从待排序部分取出,与已排序部分进行比较,找到合适的插入位置。
  • 将插入位置后面的元素向右移动一位,腾出位置空间,插入当前元素。
  • 以下是具体实现代码示例:

    void InsertSort(int array[]) {    int n = array.length;    for (int i = 1; i < n; i++) {        int temp = array[i];        int j;        for (j = i; j > 0 && array[j-1] > temp; j--) {            array[j] = array[j-1];        }        array[j] = temp;    }}

    该算法的时间复杂度为O(N²),适用于数据规模较小的情况。为了提高效率,可以改用二分查找法进行插入,这样可以减少元素之间的比较次数,降低时间复杂度。

    折半插入排序与直接插入排序的主要区别在于插入位置的确定方法。通过二分查找快速确定插入位置,从而减少元素移动次数,但元素移动次数不变,因此时间复杂度仍为O(N²)。

    通过以上方法可以实现对数组或列表的排序。以下是完整代码示例:

    void InsertSort(int array[]) {    int n = array.length;    for (int i = 1; i < n; i++) {        int temp = array[i];        int low = 0;        int high = i - 1;        while (low <= high) {            int mid = (low + high) / 2;            if (array[mid] > temp) {                high = mid - 1;            } else {                low = mid + 1;            }        }        for (int j = i; j > low; j--) {            array[j] = array[j-1];        }        array[low] = temp;    }}

    该代码利用哨兵法原理,将待排序元素插入到已排序序列的正确位置。通过二分查找快速确定插入位置,减少了元素比较次数。

    转载地址:http://mvtm.baihongyu.com/

    你可能感兴趣的文章
    POP-一个点击带有放大还原的动画效果
    查看>>
    POP3 协议在计算机网络中的优缺点
    查看>>
    qt批量操作同类型控件
    查看>>
    Portaudio笔记-WASAPI
    查看>>
    position:fixed失效情况
    查看>>
    Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
    查看>>
    Position属性四个值:static、fixed、absolute和relative的区别和用法
    查看>>
    POSIX thread编程中关于临界区内条件变量的分析
    查看>>
    POSIX与程序可移植性
    查看>>
    posix多线程有感--自旋锁
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>
    POSIX标准和XSI扩展
    查看>>
    post install error,please remove node_moules before retry
    查看>>
    postcss-pxtorem 参数之selectorBlackList、exclude的用法
    查看>>
    Postek博思得标签打印机更换电脑,打印出来标签空白
    查看>>
    postfix+ dovecot搭建邮件服务器
    查看>>
    postfix在邮件服务器中的使用
    查看>>
    PostGIS 3.1.2软件安装详细教程(地图工具篇.8)
    查看>>
    PostGIS中获取所有EPSG的编码以及对应Proj4字符串
    查看>>
    SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
    查看>>