一、打印一个int的32位二进制信息
public static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
关于位的一些知识:
1) 左移: 00100<<1=01000
右移:>>(高位用符号位补) >>>(高位用符号位补)
2) 与运算:4(0100)&15(1111)= 4(0100)
2(0010)&1(0001)= 0
或运算: | 有一个为1该位为1
亦或: ^ 不同为1,相同为0
~取反: ~0100=1011
3) int二进制存储,32位,最高位标记正负,0代表正,1代表负数
负数(-n)= ~n + 1;
特殊:-Integer.MIN_VALUE = Integer.MIN_VALUE;
二、选择排序
public static void selectSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[minIndex] <= arr[j] ? minIndex : j;
}
if (minIndex != i){
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
选择排序流程分析
1、遍历0到n-1选出最小值与0位置交换(此时0位置比任何一个1到n-1的数字都要小)
2、遍历1到n-1选出最小值与1位置交换(因为0位置比任何一个1到n-1都要小,从1位置开始就好,
且此时1位置比任何一个2到n-1都要小)
3、遍历2到n-1选出最小值与2位置交换(此时2位置比任何一个3到n-1的数字都要小)
4、最终数组样子(0到n-1最小),(1到n-1最小),(2到n-1最小)......
三、冒泡排序
public static void bubbleSort(int[] arr){
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length; i > 0; i--) {
for (int j = 1; j < i; j++) {
if (arr[j-1] > arr[j]){
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
}
冒泡排序流程分析
1、(0到n-1)0位置与1位置比较,大的放1位置,1位置与2位置比较,大的放2位置
......n-2与n-1比较,大的放n-1,n-1是最大值
2、(0到n-2)0位置与1位置比较,大的放1位置,1位置与2位置比较,大的放2位置
......n-3与n-2比较,大的放n-2,n-2是最大值
3、(0到n-3)最大值到n-3,(0到n-4)最大值到n-4......直至结束
四、插入排序
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 + 1] < arr[j]; j--) {
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
插入排序流程分析
1、保证0-1有序,1位置与0位置比较,若1位置比0位置小交换,不论结果如何,已到数组边界,结束
2、保证0-2有序,2位置与1位置比较,若2位置比1位置小交换,接过程1
若2位置比1位置大,结束,因为0-1是有序的)
3、保证0-3有序,3位置与2位置比较,若3位置比2位置小交换,接过程2
若3位置比2位置大,结束
4、重复直至结束
疑惑:怎么感觉插入排序跟冒泡排序一样啊?
虽然它们的最坏情况是一样的,但是插入排序找到位置后流程就进入下一阶段,循环停止,而冒泡排序还要把循环走完,这个自己人脑debug以下,对着代码走一遍流程不难发现