本文是对《算法图解》的第二章的学习的笔记。欢迎多多指正。
数组和链表
数组:
使用数组存储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;
}