01.选择排序 (选最小,交换位置)
/*
选取最小值,交换位置
0~N
1~N
2~N
思路:
1.先定一个数,后再剩下的里面选最小的,与第一个数交换位置
2.下一轮,第一个数已经是最小的了,从第二个数开始,与剩下三以后数进行比较
*/
//1.选择排序
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 minValueIndex = i;
//与后面的值进行比较
for (int j = i + 1; j < N; j++) {
//注:这里不能是i,这里的数要跟新的
minValueIndex = arr[minValueIndex] > arr[j] ? j : minValueIndex;
}
swap(arr, i, minValueIndex);
}
}
//交换
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//打印
public static void printAll(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
//把最小的值获取到,然后赋值给最小值,在外面循环中交换,更优。
//1
public static void selectSort(int[] arr) {
int N = arr.length;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (arr[i] > arr[j]) {
swap(arr, i, j);
}
}
}
}
02. 插入排序(交换位置,可以跨越多个数)
public static void insertSort(int[] arr) {
int N = arr.length;
for (int i = 1; i < N; i++) {
int newIndex = i;
while (newIndex > 0 && arr[newIndex - 1] > arr[newIndex]) {
swap(arr, newIndex - 1, newIndex);
newIndex--;
}
}
}
03.冒泡排序(两个数之间进行比较)
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
int N = arr.length - 1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}