参考视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵) 点击观看
文章目录
中点
int mid = (L + R) / 2;
int mid = L + (R - L) / 2;(防止溢出)
int mid = L + ((R - L) >> 1);
>> 1 相当于除以2,但位运算比算术运算更快
注意括号必须加,因为移位运算符优先级低于加法
使用递归方法求一个数组L到R的最大值
java
public class Main {
public static void main(String[] args) {
//使用递归方法求数组中L到R的最大值
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println(getMax(arr, 0, arr.length - 1));
}
public static int getMax(int[] arr, int L, int R) {
if (L == R) {
return arr[L];
}
int mid = L + ((R - L) >> 1);
int leftMax = getMax(arr, L, mid);
int rightMax = getMax(arr, mid + 1, R);
return Math.max(leftMax, rightMax);
}
}

归并排序
java
public class Main {
public static void main(String[] args) {
//归并排序
int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
mergeSort(arr, 0, arr.length - 1);
}
public static void mergeSort(int[] arr, int left, int right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int m = 0; m < k; m++) {
arr[left + m] = temp[m];
}
System.out.println("归并:");
for (int n = left; n <= right; n++) {
System.out.print(arr[n] + " ");
}
}
}

java
public class Main {
public static void main(String[] args) {
//归并排序求解小和问题
int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
int sum = mergeSort(arr, 0, arr.length - 1);
System.out.println(sum);
}
public static int mergeSort(int[] arr, int left, int right) {
if (left == right) {
return 0;
}
int mid = (left + right) / 2;
return mergeSort(arr, left, mid)+
mergeSort(arr, mid + 1, right)+
merge(arr, left, mid, right);
}
public static int merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = 0;
int res = 0;
while (i <= mid && j <= right) {
res+=arr[i] < arr[j] ? arr[i] * (right - j + 1) : 0;
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int m = 0; m < k; m++) {
arr[left + m] = temp[m];
}
System.out.println("归并:");
for (int n = left; n <= right; n++) {
System.out.print(arr[n] + " ");
}
System.out.println();
return res;
}
//8, 4, 5, 7, 1, 3, 6, 2
//4+9+1+13+1=28
}
快速排序
例子

情况1:左边是小于等于num的数右边是大于num的数

情况2:左边是小于num的数中间是等于num的数右边是大于num的数

