排序算法总结(二)插入排序

news/2024/10/9 9:21:57 标签: 排序算法, 数据结构

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

插入排序是在一个有序集合中插入一个元素,插入后这个集合还是有序状态。如果一个数组本来是无序的,要用插入排序算法使之有序,这个过程就叫插入排序。这个算法要点在于要先有一个排过序的集合,如果把第一个元素看做是有序的,那么这个集合就有了,接下来就是在剩下的元素中遍历一次,把每个元素插入到前面的有序集合中。

如果数组的元素个数是n,我们看看在第i个元素插入时的状态,这时i元素之前的所有元素都是从小到大排过序的,从有序集合的最后一个元素依次往前搜索,找到一个前一个元素比i元素小,本元素比i元素大的位置,把i元素插入这个元素之前。这里有一个问题,由于数组元素是紧密排列的,要插入元素,就需要一个空位置,这个位置是在往前搜索过程中,逐个把元素往后移一个位置,覆盖i元素后腾出来的。

用C语言写一个函数实现这个算法。

void insertion_sort(int *ai, int n)

{  

    int         i, j;

    int         ei;

    /* 0元素是有序的,从1开始遍历数组中的其他元素,插入有序集 */   

    for (i = 1; i < n; i++) {

        /* 保存当前的元素值,因为要往后移动元素,会覆盖当前元素 */

        ei = ai[i];

        /* i-1的元素就是有序集合中的最后一个元素,往前搜索 */

        for (j =i-1; j >= 0; j--) {

            if (ai[j] < ei)

                /* 找到比当前元素小的位置,终止循环 */

                break;

            /* 当前元素比有序集合中的j元素小,往后移动j元素

             * 第一个循环时,ai[j+1]就是ai[i]元素,被覆盖掉

             * 后续循环,前一个元素把后一个元素覆盖

             */

            ai[j+1] = ai[j];

        }

        /* ai[j]比当前元素小或相等,那么ai[j+1]就是移动后空出来的位置 */

        ai[j+1] = ei;

    }

}

其实一个一个的往后移动元素,还是很耗费资源的,我们可以找到插入的位置,然后把需要移动的元素一次性的往后移动一个位置。修改一下程序如下。

static void insertion_sort(int *ai, int n)

{  

    int         i, j;

    int         ei;

   

    for (i = 1; i < n; i++) {

        ei = ai[i];

        /* 可以从头查找,不用倒序查找 */

        for (j = 0; j < i; j++) {

            if (ai[j] > ei)

                /* 找到比当前元素大的位置,退出循环 */

                break;

        }

        /* 移动元素,空出插入的位置 */

        memmove(&ai[j+1], &ai[j], (i-j)*sizeof(int));

        ai[j] = ei;

    }

}


http://www.niftyadmin.cn/n/5695633.html

相关文章

html内嵌其他网页iframe

在很多情况下&#xff0c;需要将其他网页内嵌到自己的网页&#xff0c;如&#xff1a; 只需要使用iframe标签即可&#xff0c;通过src属性指定网站地址即可&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta ch…

输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张

输电线路缺陷图像检测数据集&#xff0c;分为导线散股&#xff0c;塔材锈蚀两类&#xff0c;分别为581张和1407张&#xff0c;标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…

elasticsearch 8.2 版本账号密码设置及SSL设置

背景:elasticsearch 8.2 设置账号密码-CSDN博客 failed to load SSL configuration does not contain any trusted certificate entries [2024-10-08T17:06:53,704][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main] org…

【devops】devops-ansible之剧本变量使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》从问题中去学习k8s 《docker学习》暂未更…

Kafka 动态分区详解

Kafka 动态分区的概念指的是在运行时动态地增加主题的分区数&#xff0c;从而提升消息处理的并发性和吞吐量。Kafka 的分区是一个非常重要的概念&#xff0c;它决定了消息的分发方式以及消费者的并行消费能力。增加分区可以有效提高并发度&#xff0c;但在增加分区时如何保证数…

03_23 种设计模式之《原型模式》

文章目录 一、原型模式基础知识原型模式的结构应用场景 实例拷贝构造函数被调用场景如下&#xff1a;典型的应用场景&#xff1a; 一、原型模式基础知识 原型模式是一种创建型设计模式&#xff0c;其功能为复制一个运行时的对象&#xff0c;包括对象各个成员当前的值。而代码又…

数据湖数据仓库数据集市数据清理以及DataOps

一提到大数据我们就知道是海量数据&#xff0c;但是我们并不了解需要从哪些维度去考虑这些数据的存储。比如 数据湖、数据仓库、数据集市&#xff0c;以及数据自动化应用DataOps有哪些实现方式和实际应用&#xff0c;这篇文章将浅显的做一次介绍。 数据湖 数据湖是一种以自然…

YUV视频数据类型

YUV视频数据类型 1. 概述2. YUV420P2.1 YU122.2 YV123. YUV420SP3.1 NV213.2 NV124. YUV 和 RGB 转换1. 概述 YUV 视频数据是根据一个亮度 Y 和两个色度 UV 来定义的颜色空间。常见的 YUV 格式有 I420,NV12,YV12。 YUV 有三种采样模式,其中: YUV 4:4:4 采样,每一个 Y 对…