資料結構與演算法之陣列

2021-07-10 02:42:39 字數 1919 閱讀 1645

陣列的基本概念:陣列是最簡單最常用的資料結構,但是也有一些注意事項:

(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];//每一維單獨分配,長度可以不一致;

vectora4[10];//只能在c++中使用;

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

資料結構與演算法之陣列

1 陣列的定義 陣列是相同型別資料的有序集合。他描述的是相同型別的若干個資料,按照一定先後順序排列組合而成,當中每乙個資料稱為元素,要訪問元素可以通過他的索引 下標去訪問他 2 陣列的幾個基本要素 1 陣列一旦被建立,其大小是不可以改變的,也就是長度是確定的 2 元素型別是相同型別 3 陣列型別可以...

基本資料結構與演算法 之陣列

1.mxn的矩陣,若某個元素值為0,則將其所在的行和列全置為0。定義行陣列rows,列陣列cols。如果a i j 為0,則將rows i 和cols j 置為true。當遍歷完整個a陣列後,根據rows和cols的值對矩陣進行修改。2.陣列a,將a 0 a p 和a p 1 a n 1 這兩段交換...

資料結構與演算法之美 4 陣列

陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。在面試的時候,面試官常常會問陣列和鍊錶的區別,很多人都回答說,鍊錶適合插入 刪除,時間複雜度 o 1 陣列適合查詢,查詢時間複雜度為 o 1 實際上,這種表述是不準確的。陣列是適合查詢操作,但是查詢的時間...