一,选择排序
public class Maopao {
public static void main(String[] args) {
int[] arr = new int[]{9, 1, 3, 4, 54, 56, 23, 22, 20, 43};
for (int i = 0; i < arr.length; i++) { // 遍历每一个数组 从排序好的序列的下一个开始
int current = arr[i];
int minIndex = i; // 记录最小值所在的下标
for (int j = i + 1; j < arr.length; j++) { // 本轮最小的值的下标
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
} // 结束就找到了从 i 开始最小的值所在的下标
arr[i] = arr[minIndex];
arr[minIndex] = current;
}
for (int i : arr) {
System.out.println(i);
}
}
}
二,插入排序
public class Charu {
public static void main(String[] args) {
int[] arr = new int[]{3, 1, 5, 3, 23, 34, 1, 45, 23, 34};
for (int i = 0; i < arr.length - 1; i++) {
int current = arr[i + 1];
int index = i;
for (; index >= 0 && current < arr[index]; index--) {
arr[index + 1] = arr[index];
}
arr[index + 1] = current;
}
for (int arrs : arr) {
System.out.println(arrs);
}
}
}
三,冒泡排序
import java.util.Arrays;
public class Maopao {
public static void main(String[] args) {
int[] arr = {12, 23, 34, 19, 25};
for (int j = 0; j < arr.length - 1; j ++) { // 比较的次数
for (int i = 0; i < arr.length - 1 - j; i ++) {
if (arr[i] > arr[i + 1]) {
arr[i] = arr[i] ^ arr[i + 1];
arr[i + 1] = arr[i] ^ arr[i + 1];
arr[i] = arr[i] ^ arr[i + 1];
}
}
}
System.out.println(Arrays.toString(arr));
}
}
四,二分查找
public class Erfen {
public static void main(String[] args) {
int[] arr = {1, 2, 4, 6, 7, 9, 10, 29, 30, 34, 56};
int key = 34;
int start = 0;
int end = arr.length - 1;
int mid = (end + start) / 2;
while (start <= end) {
if (arr[mid] == key) {
System.out.println(mid);
break;
} else if (arr[mid] > key) {
end = mid - 1;
} else {
start = mid + 1;
}
mid = (start + end) / 2;
}
if (start > end) {
System.out.println(-1);
}
}
}
五 快速排序
import java.util.Arrays;
public class Main3 {
public static void main(String[] args) {
// 快排
int[] nums = {2, 7, 9, 0, -1, 2, -9};
quickSort(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int jiZhun = arr[left];
int i = left;
int j = right;
while (i != j) {
// 找到比基准值小的下标
while (j > i && arr[j] >= jiZhun) {
j --;
}
// 找到比基准值大的下标
while (j > i && arr[i] <= jiZhun) {
i ++;
}
if (i < j) {
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
}
}
if (arr[i] < jiZhun) {
arr[left] = arr[i];
arr[i] = jiZhun;//指针重合之后判断所指的数和jizhun数的大小,因为jizhun数在首位,所以比jizhun数小就交换
}
// 数组以 i 下标分成左边 和右边两部分 i 左边 小于 基准值 i 右边比基准值大
// 排序左边
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
六 求一个数的质因数
public class Main4 {
public static void main(String[] args) {
fenJiePrime(2);
// System.out.println(new Random().nextInt(39) + 1);
}
public static void fenJiePrime(int num) {
System.out.print(num + " = ");
// 如果是质数直接输出
if (isPrime(num)) {
System.out.print(num);
return;
}
for (int i = 2; i <= num; i++) {
while (num % i == 0) {
if (num / i == 1) {
System.out.print(i);
} else {
System.out.print(i + " * ");
}
num = num / i;
}
}
}
public static boolean isPrime(int num) {
int count = 0;
// 除了 1 之外能整除的数量
for (int i = 2; i <= num; i++) {
if (num % i == 0) {
count++;
}
if (count == 2) {
return false;
}
}
return count == 1;
}
}