数据结构与算法之数组
来源:互联网 发布:老巴黎西洋家具淘宝网 编辑:程序博客网 时间:2024/04/30 07:28
数组的基本概念:数组是最简单最常用的数据结构,但是也有一些注意事项:
(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>()]);
- 数据结构与算法之数组
- 数据结构与算法之数组
- Java数据结构与算法之数组
- Java数据结构与算法之Array数组
- 数据结构与算法01 之数组
- java数据结构与算法之数组篇
- Java数据结构与算法之Array数组
- 算法与数据结构 - 数组
- 数据结构与算法:数组
- 算法与数据结构 之数组(三) 趣味算法
- 《算法学习与数据结构》part3 算法分析与数据结构之数组和广义表
- 数据结构与算法之—数组(一)
- 数据结构与算法之—数组(二)
- 数据结构与算法之动态数组实现堆栈
- Java数据结构与算法之数组(一)
- Java数据结构与算法之数组(二)
- Java数据结构与算法之数组排序——冒泡
- Java数据结构与算法之数组排序——选择
- 黑马程序员_class与classPath
- 关于feof()多读取一次的问题(还未解决)
- Linux关闭sendmail服务
- 2016寒假训练——字典树
- V$ROLLSTAT
- 数据结构与算法之数组
- linux 安装memcache 到简单使用
- 0136 Spring的七大模块简介
- Apache Thrift 中篇
- MapReduce工作原理图文详解
- Spring事务管理—aop:pointcut expression解析
- codeforce 343div2 C dp好题
- kafka consumer不能消费消息及其处理办法
- EditText在启动Activity时不自动获取焦点