java基础笔记
1 笔记链接
2 语言基础
2.1 难点
public class Test{
public static void main(String[] args){
int a = 20;
int b = 20;
for (int i = 0 ; i < 10 ; i++){
a = a++;
}
for (int i = 0 ; i < 10 ; i++){
b = ++b;
}
System.out.println("a:" + a + ";b:" + b);
}
}
答案
a:20;b:30
3 数组
3.1 希尔排序
定义一个变量gap,gap的初始大小为数组的长度int gap = arr.length;
,每次while循环,gap/=2
,然后进入for循环,循环次数是gap次for (int i = 0; i < gap; i++) {}
。在这个for循环里面进行插值排序,插值排序的for循环初始值为外面for循环的变量值+gap,当插值排序的for循环变量小于数组的长度时,此变量每次增加gapfor (int j = i + gap; j < arr.length; j += gap) {}
,定义一个局部变量int t = arr[j]
,定义数组索引int index = j - gap
,判断当索引大于或者等于0并且arr[index] > t
时把索引为index 的值赋给 索引为 index + gap ,直到 index >= 0 && arr[index] > t
不成立,arr[index + gap] = t
;当gap = 1的时候,排序就完成了。
希尔排序的代码:
public static int[] shellSort(int[] arr) {
int gap = arr.length;
while (true) {
gap /= 2;
for (int i = 0; i < gap; i++) {
for (int j = i + gap; j < arr.length; j += gap) {
int t = arr[j];
int index = j - gap;
while (index >= 0 && arr[index] > t) {
arr[index + gap] = arr[index];
index -= gap;
}
arr[index + gap] = t;
}
}
if (gap == 1) {
break;
}
}
return arr;
}
测试数组:
int[] arr = {
1, 8, 7, 6, 2, 9, 0, 3, 5, 4};
结果:
原数组:
1 8 7 6 2 9 0 3 5 4
排序后:
0 1 2 3 4 5 6 7 8 9
3.2 快速排序
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
public static int[] quikeSort(int[] arr, int start, int end) {
int i = start;
int j = end;
int pivot = arr[start];
while (i < j) {
while (i < j && pivot < arr[j]) {
j--;
}
arr[i] = arr[j];
i++;
while (i < j && pivot > arr[i]) {
i++;
}
arr[j] = arr[i];
j--;
}
arr[i] = pivot;
if (i - 1 > start) {
quikeSort(arr, start, i - 1);
}
if (j + 1 < end) {
quikeSort(arr, j + 1, end);
}
return arr;
}
测试数组:
int[] arr = {
1, 8, 7, 6, 2, 9, 0, 3, 5, 4};
结果:
原数组:
1 8 7 6 2 9 0 3 5 4
排序后:
0 1 2 3 4 5 6 7 8 9
3.3 二分查找
二分查找要求数组必须是有序的。也可以叫折半查找,定义一个变量int low = 0;
,定义第二个变量int upper = arr.length - 1;
,当low <= upper 时一直进行while循环,循环内定义一个变量int mid = (low + upper) / 2;
,用mid下标所在的值和需要查找的值比较,min下标的值大,upper = mid - 1;
,mid下标的值小,low = mid + 1;
,
public static int bainarySearch(int[] arr,int num){
int low = 0;
int upper = arr.length -