int类型占用4个字节,共占32位。int数值范围:-2^31 ~ 2^31 - 1
Integer.MIN_VALUE = -2147483648 对应的二进制为:10000000000000000000000000000000
Integer.MAX_VALUE = 2147483647 对应的二进制为:01111111111111111111111111111111
最高位来标识正负数,1代表负数,0代表整数
举例说明:
5对应的二进制位 00000000000000000000000000000101
101 = 1 * 2^2 + 1 * 2^0 = 4 + 1 = 5
正整数对应的负整数怎么算?正数取反 + 1
比如正数5,对应的负数为-5。
00000000000000000000000000000101 5对应的二进制
11111111111111111111111111111010 取反
11111111111111111111111111111011 加一
-5 对应的二进制码为:11111111111111111111111111111011
代码如下:
private static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
思路:选择排序就是选择最小数,依次放到指定的位置上。
0 ~ N-1 从第0位到N-1位,选择一个最小数,放到第0位置上。
1 ~ N-1 从第1位到N-1位,选择一个最小数,放到第1位置上。
2 ~ N-1 从第2位到N-1位,选择一个最小数,放到第2位置上。
public class Code03_SelectSort {
/**
* 0 ~ N-1 从第0位到N-1位选择一个最小数,放到第0位上
* 1 ~ N-1 从第1位到N-1位选择一个最小数,放到第1位上
* 2 ~ N-1 从第2位到N-1位选择一个最小数,放到第2位上
*/
public static void selectSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
// 外层循环控制循环次数
for (int i = 0; i < N; i++) {
// 假设每次循环第一个数为最小
int mixValueIndex = i;
// 找最小数
for (int j = i + 1; j < N; j++) {
mixValueIndex = arr[j] < arr[mixValueIndex] ? j : mixValueIndex;
}
// 交换位置
swap(arr, i, mixValueIndex);
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static void print(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {10, 5, 8, 2, 1, 4, 9, 3, 2, 0};
print(arr);
selectSort(arr);
print(arr);
}
}
思路:
每次比较相邻的两个数的大小,两两交换,第一趟下来,最大数在数组的最右边,依次类推。
0 ~ N-1
0 ~ N-2
0 ~ N-3
0 ~ end
public class Code04_BubbleSort {
/**
* 相邻两位,两两互换
* 0 ~ n-1
* 0 ~ n-2
* 0 ~ n-3
* 0 ~ end
*/
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
// 外层循环控制循环多少次
for (int end = N - 1; end >= 0; end--) {
// 内存循环控制两两交换
// 0 1 1 2 2 3 ...
for (int second = 1; second <= end; second++) {
if (arr[second - 1] > arr[second]) {
swap(arr, second - 1, second);
}
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static void print(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {10, 5, 8, 2, 1, 4, 9, 3, 2, 0};
print(arr);
bubbleSort(arr);
print(arr);
}
}
思路:类似玩扑克牌,左边已经排好序,每次来一张牌,从右向左进行比较,比较完后,从左到右都是已经排好序了。
0 ~ 0 已经排好序了(第一张牌就是有序的)
0 ~ 1 排好序
0 ~ 2 排好序
0 ~ 3 排好序
0 ~ N 排好序
public class Code04_InsertSort {
/**
* 插入排序类似玩扑克牌,每次来的牌插入之前已经排好序的牌中,类似插入一样。
*/
public static void insertSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
for (int end = 1; end < N; end++) {
int newNumIndex = end;
while ((newNumIndex - 1) >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
swap(arr, newNumIndex - 1, newNumIndex);
newNumIndex--;
}
}
}
public static void insertSort2(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length;
for (int end = 1; end < N; end++) {
for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
swap(arr, pre, pre + 1);
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static void print(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {10, 5, 8, 2, 1, 4, 9, 3, 2, 0};
print(arr);
insertSort(arr);
print(arr);
}
}
阅读量:933
点赞量:0
收藏量:0