目录
1. 认识复杂度和简单排序算法
选择排序
/**
* 选择排序
* i ~ N-1 选择最小值放入i位置
*
* @param arr
*/
public static void selectSort(int[] arr) {
//判断临界值
if (null == arr || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) { // i ~ N-1
//记录最小值下标
int target = i;
for (int j = i + 1; j < arr.length; j++){
target = arr[target] > arr[j] ? j : target;
}
//交换
swap1(arr,i,target);
//swap2(arr,i,target);
}
}
冒泡排序
/**
* 冒泡排序
* @param arr
*/
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++){ //从1~(i-1)进行比较
if(arr[j]>arr[j+1]){
swap1(arr,j,j+1);
}
}
}
}
异或
-
一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在一个,请找出这个数
/** * 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在一个,请找出这个数 * @param arr */ public static void getOne(int[] arr){ //异或的特点:交换率,结合率 // 0 与任何数^为任何数 int result = 0; for(int item : arr){ result ^= item; } System.out.printf("result:= %d\n", result); }
思路:
根据异或的特点,偶数个数的数异或的结果为0,0与任何数异或为异或,所以结果为奇数个数的数
-
一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在两个,请找出这两个数
/** * 一个int数组,里面偶数个相同的数存在多个,奇数个相同的数存在两个,请找出这两个数 * @param arr */ private static void getTwo(int[] arr) { int eor = 0; for(int cur : arr){ eor ^= cur; } //获取最右边的1 int rightOne = eor & (~eor + 1); int eor1 = 0; for(int cur : arr){ if((cur & rightOne) == 0){ //分组,筛选出对应位置不同的数 eor1 ^= cur; } } System.out.printf("a = %d, b = %d\n", eor1 ^ eor , eor1); }
思路:
假设结果为a,b
-
所有数进行异或 eor = a^b
-
a != b ,所以a 和 b 的二进制存在一个位置不同,假设第8位不同
-
将数组分为两部分, 第8位为1,第8位为0
-
其中一部分所有数进行异或,结果 eor' = a或者b
-
eor ^ eor' = a或者b
-
插入排序
/**
* 插入排序
* @param arr
*/
private static void insertSort(int[] arr) {
//[4,1,3,2]
//0~1
//0~2
//0~3
//0~4
if (null != arr && arr.length < 1) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
swap2(arr, j, j - 1);
}
}
}