資料結構與演算法 陣列(基礎篇)

2021-10-03 13:10:42 字數 3502 閱讀 2304

博主也是第一次當博主,想要做一名名副其實的程式設計師,當然本質可能還是個商科生,看到部落格的朋友可以一起交流經驗,wechat:lyi_1998

陣列(array):是一種線性表結構。它用一組連續的記憶體空間來儲存一組具有相同型別的資料,同時它也是最基礎的資料結構。

!此處應有線性表概念:資料排成一條線,每個線性表上的資料最多只有前後兩個方向。常見的線性表資料結構有:陣列、鍊錶、佇列和棧等。

!此處應有有疑問,什麼是非線性表?其中就有樹、堆、圖等資料結構。它們的資料之間並不是簡單的前後關係,所以是非線性的。

下面正式介紹陣列的使用!

一般我們都是利用陣列進行增刪查資料,眾所周知,陣列查詢速度較快,插入刪除資料較慢,這個是為何?看下面!

根據我學習的專欄《資料結構與演算法之美》知識得知,對於下述**,

int

arr =

newint[10

];

一維陣列:

a[i]_address = base_address + i *

data_type_size

m*n陣列:

a[ i ][ j ](i < m, j < n)的定址公式為:

a[ i ][ j ]_address = base_address + (i * n + j) * data_type_size

說明:data_type_size表示陣列中每個元素的大小,即幾個位元組

由此得出下圖,計算出該元素的記憶體位址,由下標隨機訪問陣列中的某個元素的時間複雜度為o(1)

若從第k位插入,則後續所有資料往後移,此舉是為了保證記憶體的連續性。

只記得平均時間複雜度:o(n)

特殊情況提高效率:如果不是有序陣列,那麼可以直接把第k個位置上的資料移動到最後,然後將要插入的資料放在k位置上,這樣時間複雜度就為:o(1)

陣列容器

儲存基本資料型別以及引用資料型別

儲存引用資料型別

長度固定

長度可變

儲存元素必須為統一資料型別

儲存可不唯一資料型別

ps:arraylist(底層用陣列實現)

package data_structure;

public

class

myarray

// 插入操作,按順序

public

void

insert

(int value)

}// 將插入位置及之後的元素後移一位,最後一位先開始移動

for(

int j = size; j > i; j--

)// 將新增元素放置在i處

array[i]

= value;

size++;}

// 刪除操作

public

void

delete

(int index)

else

size--;}

}// 修改操作

public

void

modify

(int index,

int value)

// 查詢操作:根據值二分查詢

public

intbinarysearch

(int value)

else

if(array[mid]

else

if(array[mid]

> value)}}

// 查詢操作:下標查詢

public

intsearch

(int index)

// 顯示陣列

public

void

display()

system.out.

print

("]");

}public

static

void

main

(string[

] args)

}}

方法一:自定義自動擴容

參考陣列

public

class

dynamicarray

public

static

int[

]insert

(int index,

int num)

// 先判斷陣列是否已經存滿

int[

] brr = null;

if(arr.length == size)

brr[index]

= num;

// 插入陣列

arr = brr;

// 將變數arr指向擴容後的陣列brr

}else

arr[index]

= num;}

size ++

;return arr;

}// 擴容

public

static

int[

]expandarray

(int

arr)

}

方法二:jdk自帶擴容演算法:array.copyof(array,newlength);
public

class

dynamicarray1

public

static

int[

]insert

(int index,

int num)

// 先判斷陣列是否已經存滿

int[

] brr = null;

if(arr.length == size)

brr[index]

= num;

// 插入陣列

arr = brr;

// 將變數arr指向擴容後的陣列brr

}else

arr[index]

= num;}

size ++

;return arr;

}public

static

int[

]expandarray

(int

arr)

}

參考:

1.極客時間的《資料結構與演算法之美》專欄

2.資料結構與演算法——陣列

資料結構與演算法 陣列

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...

資料結構與演算法 陣列

題型1 如何用遞迴實現陣列求和 方法1 題型2 如何用乙個for迴圈列印乙個二維陣列 方法1 array在二維陣列中的行號和列號分別為 i maxy i maxy 題型3 用遞迴和非遞迴的方法實現二分查詢 題型4 如何在排序陣列中,找出給定數字出現的次數 方法1 二分查詢,分別找出左邊界和右邊界,左...

資料結構與演算法 陣列

陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 陣列定義為一維陣列 二維...