zoukankan      html  css  js  c++  java
  • 数据结构与算法之数组

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

    (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>()]);



  • 相关阅读:
    仿照京东做的一个鼠标移上去的图片文字说明效果
    js 之 复制一段代码
    自己练习了一个弹出框
    用jq 做了一个排序
    做了一个类似天猫鼠标经过icon的动画,记录一下
    一行代码写一个轮播,想了好久,感觉这样可以。
    一个小例子,全选复选框
    仿照淘宝首页做的一个高度伪对齐demo
    《挑战程序设计竞赛》2.2 贪心法-区间 POJ2376 POJ1328 POJ3190
    《挑战程序设计竞赛》2.1 穷竭搜索 POJ2718 POJ3187 POJ3050 AOJ0525
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7040399.html
Copyright © 2011-2022 走看看