1. 复杂度和简单排序算法(选择排序、冒泡排序、插入排序)
0. 认识时间复杂度

1. 选择排序


代码示例
import java.util.Arrays;
public class MySort {
public static void selectionSort(int[] arr){
// 特殊处理
if(arr == null || arr.length < 2) return;
// 遍历选择最小的元素
for (int i = 0; i < arr.length - 1; i++) {
// 临时变量存储最小位置索引
int minIndex = i;
for (int j = i+1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
if(i != minIndex) swap(arr, i, minIndex);
}
}
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// for test
// 对数器
public static void comparator(int[] arr){
Arrays.sort(arr);
}
// for test
// 获得随机大小的随机值数组
public static int[] generateRandomArray(int maxSize, int maxValue){
// Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1));
}
return arr;
}
// for test
// 数组的复制
public static int[] copyArray(int[] arr){
// 特殊情况处理,避免异常
if(arr == null) return null;
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
// for test
// 判断结果是否相等
public static boolean isEqual(int[] arr1, int[] arr2){
if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
return false;
if(arr1 == null && arr2 == null)
return true;
if(arr1.length != arr2.length)
return false;
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]) return false;
}
return true;
}
// for test
// 输出
private static void printArray(int[] arr) {
if(arr == null) return;;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100000;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
// 开始排序
selectionSort(arr1);
comparator(arr2);
// 判断结果是否相等
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
selectionSort(arr);
printArray(arr);
}
}
2. 冒泡排序


代码示例
import java.util.Arrays;
public class MySort {
public static void bubbleSort(int[] arr){
if(arr == null || arr.length < 2) return;;
for(int i = arr.length-1; i > 0; i--){
for (int j = 0; j < i; j++) {
if(arr[j] > arr[j + 1]) swap(arr, j, j+1);
}
}
}
public static void swap(int[] arr, int i, int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
// for test
// 对数器
public static void comparator(int[] arr){
Arrays.sort(arr);
}
// for test
// 获得随机大小的随机值数组
public static int[] generateRandomArray(int maxSize, int maxValue){
// Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1));
}
return arr;
}
// for test
// 数组的复制
public static int[] copyArray(int[] arr){
// 特殊情况处理,避免异常
if(arr == null) return null;
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
// for test
// 判断结果是否相等
public static boolean isEqual(int[] arr1, int[] arr2){
if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
return false;
if(arr1 == null && arr2 == null)
return true;
if(arr1.length != arr2.length)
return false;
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]) return false;
}
return true;
}
// for test
// 输出
private static void printArray(int[] arr) {
if(arr == null) return;;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100000;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
// 开始排序
bubbleSort(arr1);
comparator(arr2);
// 判断结果是否相等
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
}
异或运算:无进位相加。


(1)异或运算的应用1

代码示例
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 7;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);
}
}
(2)异或运算的应用2

两种数数出现奇数次:

代码示例
public class Test {
// 只有一个数出现奇数次
private static void printOddTimesNum1(int[] arr1) {
int res = 0;
for (int i : arr1) {
res ^= i;
}
System.out.println(res);
}
// 两个不同的树出现奇数次
private static void printOddTimesNum2(int[] arr2) {
int res = 0;
int a = 0;
int rightOne = 0;
for(int i : arr2){
res ^= i;
}
rightOne = res & (~res + 1); // 提取最右侧的1
for (int i : arr2) {
if((rightOne & i) == 0) a ^= i;
}
System.out.println(a + " " + (a ^ res));
}
public static void main(String[] args) {
int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };
printOddTimesNum1(arr1);
int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };
printOddTimesNum2(arr2);
}
}
Tips:提取最右的1

3. 插入排序


代码示例
import java.util.Arrays;
public class MySort {
public static void insertSort(int[] arr){
if(arr == null || arr.length < 2) return;
for(int i = 1; i < arr.length; i++){
for(int j = i-1; j >= 0 && arr[j] > arr[j+1]; j--)
swap(arr, j, j + 1);
}
}
public static void swap(int[] arr, int i, int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
// for test
// 对数器
public static void comparator(int[] arr){
Arrays.sort(arr);
}
// for test
// 获得随机大小的随机值数组
public static int[] generateRandomArray(int maxSize, int maxValue){
// Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1));
}
return arr;
}
// for test
// 数组的复制
public static int[] copyArray(int[] arr){
// 特殊情况处理,避免异常
if(arr == null) return null;
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
// for test
// 判断结果是否相等
public static boolean isEqual(int[] arr1, int[] arr2){
if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
return false;
if(arr1 == null && arr2 == null)
return true;
if(arr1.length != arr2.length)
return false;
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]) return false;
}
return true;
}
// for test
// 输出
private static void printArray(int[] arr) {
if(arr == null) return;;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100000;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
// 开始排序
insertSort(arr1);
comparator(arr2);
// 判断结果是否相等
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr1);
printArray(arr2);
}
}
System.out.println(succeed ? "Nice!" : "Fucking fucked!");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
insertSort(arr);
printArray(arr);
}
}
4. 二分法

5. 对数器

6. 递归

求中点位置

最大值



浙公网安备 33010602011771号