博客
关于我
内部排序(一)直接插入排序和二分插入排序
阅读量: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/

    你可能感兴趣的文章
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    node exporter完整版
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>
    Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime(72)
    查看>>
    Node 裁切图片的方法
    查看>>
    Node+Express连接mysql实现增删改查
    查看>>
    node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
    查看>>
    Node-RED中Button按钮组件和TextInput文字输入组件的使用
    查看>>
    Node-RED中Switch开关和Dropdown选择组件的使用
    查看>>