本文是對《算法圖解》的第二章的學習的筆記。歡迎多多指正。
數組和鏈表
數組:
使用數組存儲item意味着所有item在內存中都是相連的。在數組中存儲新的item可能很麻煩,because if 沒有了新空間,就得移動到內存的其他地方,因此添加新元素會很慢。數組刪除元素也很麻煩,刪除元素後,必須將後面的元素前移。
結決辦法1 :預留空間。
缺點:
1、額外請求的位置可能用不上。這將會浪費內存。【佔着**不拉*】相信你能猜測到啥意思 xixi
2、if 預留空間還不夠,還是得轉移。
結決辦法2 :使用鏈表
鏈表:
鏈表中的元素可存儲在內存中的任何地方。鏈表中的每個元素都存儲了下一個元素的地址,從而使一系列隨機內存地址串在一起。 使用鏈表添加元素很容易,只需將其放入內存,並將地址存儲到前一個元素中就ok了,注意:使用鏈表不需要移動元素。刪除操作:鏈表也是更好的選擇,because 刪除元素只需修改前一個元素指向的地址即可。
總結:
數組讀取的運行時間 O(1) 插入O(n) 刪除 O(n)
鏈表讀取的運行時間 O(n) 插入O(1) 刪除 O(1)
注意下哈。。。 再同一個數組中,所有元素的類型都必須相同(都爲int 、double等) 弊端 引出集合
選擇排序
example: 找出播放次數組多的樂隊,必須檢查列表中的每個元素。需要的時間O(n),對於這種O(n)的操作,需要執行n次。需要的總時間即 O(n2)
下面展示一些 內聯代碼片
。
public int[] sort(int[] sourceArray) {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 總共要經過 N-1 輪比較,每一次找到最小的索引值
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每輪需要比較的次數 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 記錄目前能找到的最小值元素的下標
min = j;
}
}
// 將找到的最小值和i位置所在的值進行交換
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}