精华内容
下载资源
问答
  • 数组插入法排序原理 三.数组插入法排序实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 经过前面的学习,我们已经学会了数组遍历,在开发中,我们经常回碰到对数...

    目录

    零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

    一.简介

    经过前面的学习,我们已经学会了数组遍历,在开发中,我们经常回碰到对数组进行排序,例如:学习成绩排序,身高排序,年龄排序等等;C 语言中常见的数组排序一共有四种:

    二.数组插入法排序原理

    将要排序的数组分成两部分,每次从后面的部分取出索引最小的元素插入到前一部分的适当位置

    三.数组插入法排序实战

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 数组排序 – 插入法排序
    //@Time:2021/06/08 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    
    #include<stdlib.h>
    #include<stdio.h>
    
    void main()
    {
        int a[5] = { 12, 19, 2 , 993, -34 };
        int len = sizeof(a) / sizeof(int);
        for (int i = 0; i < len; i++)
        {
            printf("排序之前:index:%d  value:%d\n", i, a[i]);
        }
        //插入法排序
        for (int i = 1; i < len; i++) {
            int temp = a[i];
            int j = i - 1;
            while (temp < a[j]) {
                a[j + 1] = a[j];
                j--;
                if (j == -1) {
                    break;
                }
            }
            a[j + 1] = temp;
        }
        printf("-----------------------------------\n");
        for (int i = 0;i<len;i++)
        {
            printf("排序之后:index:%d  value:%d\n", i, a[i]);
        }
        system("pause");
    }
    
    /*
    输出:
    
    排序之前:index:0  value:12
    排序之前:index:1  value:19
    排序之前:index:2  value:2
    排序之前:index:3  value:993
    排序之前:index:4  value:-34
    -----------------------------------
    排序之后:index:0  value:-34
    排序之后:index:1  value:2
    排序之后:index:2  value:12
    排序之后:index:3  value:19
    排序之后:index:4  value:993
    请按任意键继续. . .
    */
    

    四.猜你喜欢

    1. 安装 Visual Studio
    2. 安装 Visual Studio 插件 Visual Assist
    3. Visual Studio 2008 卸载
    4. Visual Studio 2003/2015 卸载
    5. C 语言格式控制符/占位符
    6. C 语言逻辑运算符
    7. C 语言三目运算符
    8. C 语言逗号表达式
    9. C 语言 for 循环
    10. C 语言 while 循环
    11. C 语言 do while 和 while 循环
    12. C 语言 switch 语句
    13. C 语言 goto 语句
    14. C 语言 char 字符串
    15. C 语言 sizeof 和 strlen 函数区别
    16. C 语言 strcpy 和 strcpy_s 函数区别
    17. C 语言 memcpy 和 memcpy_s 区别
    18. C 语言 数组定义和使用
    19. C 语言 数组遍历
    20. C 语言 数组排序 – 冒泡法排序
    21. C 语言 数组排序 – 选择法排序
    22. C 语言 数组排序 – 插入法排序

    未经允许不得转载:猿说编程 » C 语言 数组排序 – 插入法排序

    展开全文
  • 动态数组原理分析

    2021-03-09 07:24:18
    一、数组原理和特点定义:一组能够存储相同数据类型的变量和集合。特点如下:保存同一数据类型。定义数组必须要有固定长度,并且不能修改。数组拥有边界检查,一旦越界,会抛出索引越界异常。数组是引用数据类型,...

    一、数组的原理和特点

    定义:

    一组能够存储相同数据类型的变量和集合。

    特点如下:

    保存同一数据类型。

    定义数组必须要有固定长度,并且不能修改。

    数组拥有边界检查,一旦越界,会抛出索引越界异常。

    数组是引用数据类型,存放在堆内存中,但同时会在栈内存中存储地址值指向堆内存中的变量。

    对象数组和基本数据类型的数组在使用上是相同的,区别是对象数组保存的是引用,基本数据类型的数组保存的是基本数据类型。

    二、动态数组的概念

    动态数组是指一个数组的长度可以无限进行扩充,已达到无限长度。其实质是创建一个新数组,长度在原数组的基础上扩充,放弃原来数组,然后把原数组中的元素复制到新的数组中。

    三、如何手动实现动态数组

    增加元素:

    在添加元素的时判断数组是否还有剩余空间。

    如果有剩余空间直接添加。

    如果没有剩余空间则转到第4步。

    创建新的数组根据扩充后的长度。

    把原数组的数据复制到新的数组中。

    删除元素:

    由于数组是线性结构,通常要保证元素的连续性。当删除的元素不是数组的末尾元素时候,我们要把被删除元素之后的元素依次前移,以确保末尾会流出空余位置,便于添加新元素的时候总在末尾,也便于避免查询时候出现空指针异常。

    422e305a2bb3412dfcce1d40121ac1a0.png

    四、具体代码实现如下

    public void addElement(Dog dog) {

    // 判断数组是否已满 添加元素

    if (count >= dogs.length) {

    // 讲原来的数组长度扩大一倍

    int newLength = dogs.length * 2;

    // 复制 根据原来的数组 创建一个新数组

    dogs = Arrays.copyOf(dogs, newLength);

    }

    // 添加数组元素

    dogs[count] = dog;

    count++;

    }

    // 删除数组元素 根据id值来删除

    public void removeElement(int id) {

    // 获取要删除的对象

    for (int i = 0; i < count; i++) {

    if (dogs[i].getId() == id) {

    // (覆盖)将该元素后面的元素整体向后移动

    for (int j = i; j < count; j++) {

    dogs[j] = dogs[j + 1];

    // 将数组最后一个元素置空

    dogs[count - 1] = null;

    count--;

    break;

    }

    }

    }

    }

    详细代码参考地址

    五、动态数组总结

    变相解决了数组固定长度带来的问题。

    使得数组成为存储效率较高的结构。

    频繁扩充会导致性能下降,产生垃圾对象数组。

    适合添加、查找、便利,但不适合插入和删除操作。

    被普遍使用在ArrayList,Vector等集合中。

    展开全文
  • 4 插入排序 在开始学习插入排序之前,让我们先对 for 循环做个补充:如下是关于 for 循环结束时,i 的取值的演示代码 int i; for (i = 5; i >= 0; i--) { System.out.print(i); } System.out.println("\n...

    4 插入排序

    • 在开始学习插入排序之前,让我们先对 for 循环做个补充:如下是关于 for 循环结束时,i 的取值的演示代码
            int i;
            for (i = 5; i >= 0; i--) {
                System.out.print(i);
            }
            System.out.println("\nfor循环结束时i=" + i);
            System.out.println("-----------------");
            for (i = 0; i <= 5; i++) {
                System.out.print(i);
            }
            System.out.println("\nfor循环结束时i=" + i);
    

    运行结果:

    543210
    for循环结束时i=-1
    -----------------
    012345
    for循环结束时i=6
    

    我们可以看到,当for循环结束时,i会最后一次执行for循环语句中的i++或者i–,那么在此基础之上我们来讲讲数组排序中的插入排序。

    4.1插入排序原理

    • 插入排序是将数组分为两部分, 将后部分的首部元素逐一与前部分的每一个元素从后往前进行比较,在合理位置插入 。
    • 插入排序算法效率要高于选择排序和冒泡排序
    步骤未排序数组array:[7,2,3,8,1]
    第一步: 在数组中划分边界,将边界右数第一个元素array[1]赋值于temp,再将temp和7进行比较[7|2,3,8,1]
    因temp小于7,则将array[1]的值改为array[0]的值[7|7,3,8,1]
    遍历结束,到达尽头,不执行循环语句体,将temp值赋予array[0],边界右移[2,7|3,8,1]
    第二步: 将边界右数第一个元素array[2]赋值于temp,再将temp和7进行比较[2,7|3,8,1]
    因temp小于7,则将array[2]的值改为array[1]的值[2,7|7,8,1]
    继续遍历,因temp不小于2,则不执行循环语句体,再将temp值赋予array[1],边界右移[2,3,7|8,1]
    第三步: 将边界右数第一个元素array[3]赋值于temp,再将temp和8进行比较[2,3,7|8,1]
    因temp不小于7,则不执行循环语句体,边界右移[2,3,7,8|1]
    第四步: 将边界右数第一个元素array[4]赋值于temp,再将temp和8进行比较[2,3,7,8|1]
    因temp小于8,则将array[4]的值改为array[3]的值,继续遍历[2,3,7,8|8]
    因temp小于7,则将array[3]的值改为array[2]的值,继续遍历[2,3,7,7|8]
    因temp小于3,则将array[2]的值改为array[1]的值,继续遍历[2,3,3,7|8]
    因temp小于2,则将array[1]的值改为array[0]的值,继续遍历[2,2,3,7|8]
    遍历结束,到达尽头,不执行循环语句体,将temp值赋值于array[0][1,2,3,7|8]

    参考代码:

            int[] arr = {7, 2, 3, 8, 1};
            System.out.println("未排序元素:\t " + Arrays.toString(arr));
            System.out.println("--------------开始排序-----------------");
            int i, j, temp;
            for (i = 1; i < arr.length; i++) {
                temp = arr[i];
                for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
                    arr[j + 1] = arr[j];
                    System.out.println("\t\t\t " + Arrays.toString(arr));
                }
                arr[j + 1] = temp;
                System.out.println("第" + i + "轮排序结果:" + Arrays.toString(arr));
                System.out.println("--------------------------------------");
            }
    

    运行结果:

    未排序元素:	 [7, 2, 3, 8, 1]
    --------------开始排序-----------------
    			 [7, 7, 3, 8, 1]
    第1轮排序结果:[2, 7, 3, 8, 1]
    --------------------------------------
    			 [2, 7, 7, 8, 1]
    第2轮排序结果:[2, 3, 7, 8, 1]
    --------------------------------------
    第3轮排序结果:[2, 3, 7, 8, 1]
    --------------------------------------
    			 [2, 3, 7, 8, 8]
    			 [2, 3, 7, 7, 8]
    			 [2, 3, 3, 7, 8]
    			 [2, 2, 3, 7, 8]
    第4轮排序结果:[1, 2, 3, 7, 8]
    --------------------------------------
    
    展开全文
  • C语言:数组排序(插入法排序)

    千次阅读 2021-11-11 12:42:13
    插入法相对较复杂,基本原理是抽出一个数据,在前面数据中寻找相应的位置插入,然后继续下一个数据,直到排序完成 以9、6、15、4、2为例来进行插入法排序 元素[0] 元素[1] 元素[2] 元素[3] 元素[4...

    插入法相对较复杂,基本原理是抽出一个数据,在前面数据中寻找相应的位置插入,然后继续下一个数据,直到排序完成

    以9、6、15、4、2为例来进行插入法排序

    元素[0]元素[1]元素[2]元素[3]元素[4]
    初始值961542
    第1次9

    第2次

    69
    第3次6915
    第4次46915
    结果246915

    从表中可知,第一次排序将第一个元素放在首位,然后取出第二元素与其比较,如果小于第一个数则放在第一个数左边,反之则放在右边。以此类推,将元素逐个取出与前面的相比较,直到最后一个元素找到相应的位置放入

    下面通过代码实现

    #include<stdio.h>
    int main()
    {
    	int arr[10];                      /*定义一个10个元素的数组*/ 
    	int i,j,temp,pos;                 /*temp记录最小值,pos记录最小值位置*/
    	for(i=0;i<=9;i++)                 /*输入各个数字*/
    	{
    		scanf("%d",&arr[i]);
    	}
    	for(i=1;i<10;i++)                  /*从数组的第二个元素开始循环*/
    	{
    		temp=arr[i];                  /*设置插入值*/ 
    		pos=i-1;                      /*记录插入值前一个位置*/ 
    		while(pos>=0&&temp<arr[pos])  /*与前面数逐个比较寻找插入值的位置*/ 
    		{
    			arr[pos+1]=arr[pos];      /*插入数值*/ 
    			pos--;
    		}
    		arr[pos+1]=temp;
    	}
    	for(i=0;i<=9;i++)                  /*输出排序后的数组*/
    	{
    		printf("%d ",arr[i]);
    	}
    	return 0;
     } 

    插入法排序共需要进行n-1次取出元素并寻找位置插入,因此当序列较为有序时,插入排序有较快的运算速度

    展开全文
  • PHP数组底层实现原理

    2021-08-15 11:02:33
    这个有序指的是插入顺序,即遍历数组的时候,遍历元素的顺序应该和插入顺序一致,而不像普通字典一样是随机的 PHP5的数组实现 HashTable HashTable的结构定义: typedef struct _HashTable { uint nTableSize; ...
  • Javascript数组

    2021-06-17 07:47:15
    数组的概念:引用类型的对象。本质:内存中存储多个数据的空间,再取个名字。数据结构:数据结构不同,擅长的操作不同。数组特点:便于数据的查找与维护。数组的创建:方法1:var数组名=【元素1,元素2,元素3.........
  • 树状数组原理

    千次阅读 2021-01-25 00:10:54
    void add(int x, int c) { //树状数组插入操作 for (int i = x;i <= n;i += lowbit(i))tr[i] += c; } ②:区间查询:1 ~ x 前缀和 for(int i = x;i <= n;i += lowbit(i))res += c; ③:单点修改: for...
  • 查找元素索引位置基本查找根据数组元素找出该元素第一次在数组中出现的索引public class TestArray1 {public static void main(String[] args) {//定义一个数组int[] arr={10,20,70,10,90,100,1,2};//根据元素查找出...
  • 1.直接插入排序的基本思想: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 2.直接插入...
  • 比如:申请十个元素,只插入6个元素,其余位置就浪费,如果插入11个元素,第11个元素就插入不了,或者重新找个新数组插入和删除效率低:插入数据时,这个后面的数据在内存中要向后移,删除数据时,这个数据后面的...
  • 动态扩容数组原理及实现

    多人点赞 热门讨论 2021-12-09 17:01:16
    动态扩容数组原理及实现 什么是数据结构? 数据结构是计算机存储、组织数据的方式; 线性表 线性表是具有 n 个相同类型元素的有限序列( n ≥ 0 ) a1 是首节点(首元素), an 是尾结点(尾元素) a1 是 a2 的...
  • #include #include #include #define NUMBER 10//NUMBER为数组的大小 void insertSort(int [],int); void display(int [],int);... }插入排序算法原理理解起来简单,从第一位开始往后遍历,找到适合的位置插入即可。
  • 直接插入排序一、直接插入原理二、直接插入代码 一、直接插入原理 直接插入排序是一种最简单的排序算法,它的直接操作是将一个记录插入到一个长度为m的有序表中,使之仍保持有序。 例如:原数组{45,38,65,97,76,13,...
  • 本文实例讲述了php插入排序法实现数组排序的...实现原理:假设(并不实际创建)有一个有序数组$arr = array(2),用$arr[1]=6来与它进行比较,如果6>2,由把$arr[0]后移到$arr[1]位置,而6插入到$arr[0]位置。接着,...
  • 时间复杂度:最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)最坏时间复杂度:O(n2)稳定性:稳定原理与实现: 遍历数组,每次把一个待排序的元素,插入到前面已经排好序的数列中的恰当位置,使数列依然有序...
  • 前言接下来我们进入集合学习,看过很多文章一上来就是讲解原理感觉会特别枯燥,任何成熟解决方案的出现都是为了解决问题,若通过实际问题引入然后再来讲解原理想必学起来必定事半功倍,从我写博客的那一天起,我就在...
  • Go-数组原理

    2021-08-06 11:11:10
    数组是Go语言中的基本类型之一,通常可以用以下方式来表示一个数组。 Go语言的数组与Java一样,在初始化的时候就需要指定数组的大小,并且确认之后就无法修改。 编译期间通过NewArray函数初始化,两个参数elem和...
  • Day5 数组插入元素与插入排序

    千次阅读 2021-01-24 15:17:49
    Day5 数组插入元素 那么接下来,我们趁热打铁,先学习最基础的数据结构:array(数组)和vector(向量),数据结构和算法是相辅相成的,二者结合彰显算法之美,所以对于常见的数据结构的掌握是很有必要的。 每日一...
  • php插入排序法实现数组排序实例,数组实例本文实例讲述了php插入排序法实现数组...实现原理:假设(并不实际创建)有一个有序数组$arr = array(2),用$arr[1]=6来与它进行比较,如果6>2,由把$arr[0]后移到$arr[1]...
  • 文章目录TypeScript常见的数组处理方式使用 `push()` 函数操作数组使用 `pop()` 函数操作数组使用 `shift()` 函数操作数组使用 `unshift()` 函数操作数组 TypeScript常见的数组处理方式 使用 push() 函数操作数组 ...
  • 传三个参数的时候,从第三个参数开始,是在删除位置依次插入第三个参数开始的数据,先删除,再插入,哪里删除,哪里插入 当不传入参数的时候,原数组不发生改变,返回值是undefined 以下为底层原理: Array.prototype....
  • 对二维数组指定的键名排序,首先大家想到的是array_multisort函数,关于array_multisort的用法我之前也写了一篇废话不多言,我们看个实例:$data = array(1001 => array('age' => 22,'name' => '鸠摩智'),...
  • ArrayMap原理解析

    2021-04-24 23:14:58
    3.ArrayMap的实现原理 它内部使用两个数组进行工作,其中一个数组记录key hash过后的顺序列表,另外一个数组按key的顺序记录Key-Value值,如下图所示: 这样做的好处就是它避免了为每个加入到map的实体构造额外的...
  • js中的类数组对象,它具有数组的下标和length,但是没有数组相关的方法(push、slice、map、、、),现将数组的方法强行给它,会发生什么呢? var obj = { '2': 3, '3': 4, 'length': 2, 'splice': Array....
  • PHP数组Key强制类型转换实现原理解析PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是字符串类型的...
  • 思路即是利用this拿到数组本身,然后遍历反复调用传入的回调函数fn,将值,索引,数组本身传进去调用,一般返回一个值,直接push进一个空数组,最后返回即可。 例子 filter 实现思路同map类似,只不过fn从返回一个...
  • js数组底层实现

    2021-01-06 15:56:42
    传统意义上的数组插入和删除是很耗费性能的,数组的长度是固定的超出数组初始的长度的时候就会抛出异常,但是查询操作非常的优秀,要增加一个超过数组长度的元素时,需要自行将数组扩容,再增加该元素。同一个数组...
  • 利用直接插入排序对无序数组进行排序 直接插入排序算法的基本原理: 直接插入排序 : 从1索引处开始,将后面的元素,插入到有序的序列中使之仍保持有序。 代码实现: package array3; import java.util.Arrays; ...
  • 数组实验报告

    2021-07-16 07:47:23
    嘉应学院计算机学院实验报告课程名称程序设计基础实验名称实验地点指导老师实验时间提交时间班级姓名座号一、实验目的和要求1、掌握一维和二维数组的定义、赋值和输入输出。2、掌握字符数组和字符串数组的使用。3、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,984
精华内容 69,993
关键字:

数组插入原理