数据结构与算法之数组

数组的基本概念:数组是最简单最常用的数据结构,但是也有一些注意事项:

(1)数组的分配方式以及存储位置;

(2)初始化;

(3)不同语言中的数组高级定义;

(4)多维数组;

C/C++中数组分配方式:

(1)int a[10];

适用于数组长度已知或者对数组长度不敏感的情况,比如定义一个字符串。

(2)int *a = (int *)malloc(sizeof(int)*n);

用在C中,适用于动态申请数组的长度。记得最后要free,防止内存泄露。

(3)int[] a = new int[n];

用在C++中。最后要delete。

进程的虚拟地址空间:

进程在运行的过程中会将地址划分为许多段,重要的有两个:运行时堆和用户栈。动态申请的数组(malloc和new)会在运行时堆中,常量数组(int a[10])会放在用户栈里面。放在运行时堆中的数组是永久性的,不主动释放就会永久存在,所以才会导致内存泄露。而在用户栈空间是临时,会随着函数的调用和返回进行回收。所以我们不能返回局部变量的地址,尤其是返回一个常量数组的首地址,因为这个地址会在用完之后被回收。所以说一个函数如果在函数内部被修改,想要在函数外部继续用的话,就要使用动态分配的数组。

C/C++中数组的初始化

编程中很多bug都是由直接引用未初始化的变量导致的,一般数组的初始话如下:

(1)全局数组自动初始化;

(2)malloc方式不初始化,可以用memset(可初始化为0或者-1),fill进行初始化;

(3)new方式需要根据编译器判断;

基础的数组直接操作内存,效率高,但是缺乏丰富的api,所以高级语言往往会有相应的高级实现。C/C++中使用STL中的vector.

多维数组是一维数组的扩展,二维数组可以用来描述矩阵或者图,如下:

    int a1[10][10];//要求数组的两维都确定;
    int **a2;//两维都不确定;
    int* a3[10];//每一维单独分配,长度可以不一致;
    vector<int> a4[10];//只能在C++中使用;
    vector<vector<int>> a5;//只能在C++中使用;

多维数组在访问过程中要注意cache缺失问题,数组可以有按行操作方式和按列操作方式。按行操作方式要好过按列操作方式。因为二维数组加载到cache的过程是按行来的,所以当在访问某一行的时候,这一行的元素都已经在cache中了。但是按列方式访问就不同,通常只有一个元素在cache中,其他元素都会缺失的,所以按列访问会造成严重的cache缺失问题,会严重影响性能。

数组在排序中的作用

对于常用的七大排序,在我前面几篇博客中都有讲到,包括代码实现。其中数组在排序中有非常大的作用,下面做一个简单的排序概述:

复杂度为O(n^2):

(1)插入排序-复杂度为O(n^2)中最快的;

(2)选择排序、冒泡排序比较慢,一般会出现在面试题中。

复杂度为O(N*logN):

(1)快速排序:基于比较的排序中速度最快的;

(2)归并排序:实际中较少使用,经常在面试中;

(3)堆排序:实际中较少使用,但是堆很常用;

复杂度为O(n),只能对正整数进行排序:

(1)基数排序-复杂度O(n+r),r为基数;

(2)计数排序-复杂度O(n+k),k为元素范围;

但是在实际开发中,C/C++中自带了排序函数:

(1)在C语言中有qsort函数,需要自定义cmp比较函数,函数形式如下:

int cmp(const void *a,const void *b);

(2)C++中,STL中自带排序函数sort,调用方法如下:

sort(a.begin(),a.end(),[greater<int>() | less<int>()]);

时间: 2024-10-06 14:57:00

数据结构与算法之数组的相关文章

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构与算法之数组

数组特点: 1.大小固定 2.同一数据类型 3.下标访问 4.数据项可重复 Java数据类型:基本类型(int和double)和对象类型.在许多编程语言中,数组也是基本类型.但在Java中把它们当作对象来对待,因此在创建数组时必须使用new操作符. 有序数组与无序数组比较:最主要的好处是查找速度比无序数组快多了.不好的方面是在插入操作中由于所有靠后的数据都需要移动以疼开空间,所以速度较慢.有序数组和无序数组数据中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的空洞. 数据访问:从

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

数据结构与算法:数组(一)

数据结构与算法是计算机发展的基石,现代计算机的起源是数学,数学的核心是算法,计算机历史上每一次大的变革都离不开算法的推动.纵然"条条大路通罗马",但好的算法永远比提高硬件设备管用. 在排序数组中找出给定数字出现的次数 计算两个有序整型数组的交集 如何找出数组中重复次数最多的数 在On的时间复杂度内找出数组中出现次数超过了一半的数 找出数组中唯一的重复元素 解题方法 引申一没有要求每个数组只访问一次不能用辅助存储空间 引申二 在排序数组中,找出给定数字出现的次数 在排序数组中,找出给定数

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

数据结构与算法实例(数组实现)

数据结构与算法实例分析-数组 ★数组是一种最简单的数据结构,它占据一块连续的内存并且顺序存储数据,所以我们需要首先指定数组的大小 ★数组的空间效率不是很好,会有空闲的区域没有得到充分的应用 ★时间复杂度为O(1); ★数组一旦被定义,它的维度和维界就不会再改变,因此除了结构的初始化和销毁之外,数组就只有存取和修改元素值得操作 1.数组的存储结构 2.基本操作 ⑴.建造空间并进行初始化:struct triple triple_init(int v1,int v2,int v3); ⑵.释放已开辟

数据结构和算法二(数组)

一.数组 1.概念 数组是一种线性表数据结构,它用一种连续的内存空间,来存储一组具有相同类型的数据. 线性表:数组.链表.队列.栈等 非线性表:二叉树.堆.图等 2.连续的内存空间和相同类型的数据 优点:具有随机范文的特性,根据下标随机访问的时间复杂度为O(1) 缺点:低效的插入和删除 插入:最好O(1),最坏O(n),平均O(n) 插入:数组若无序,插入新的元素时,可以将第K个位置元素移动到数组末尾,把新的元素插入到第K个位置,此时复杂度为O(1) 删除:最好(1),最坏O(n),平均O(n)

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

数据结构和算法-001 数组

数组,都懂的,直接看代码吧,实现以下功能: 创建数组 查找在索引上的值 查找数组中是否含有值 删除在索引上的值 添加一个值 查找一个值在数组的位置 public class ArrayStructures { private int[] theArray = new int[50]; private int arraySize = 10; public void generateRandomArray(){ for (int i =0; i< arraySize;i++){ theArray[i