选择排序
从第一位开始,取从这位开始最小的值,记住最小值的位置,然后把这个值和最开始的值做交换,这样每次都能把未排序数组中的最小值找出来,放到前面来,实现排序。
public static void main(String[] args) {
int[] intArray = {6, 3, 2, 1, 5};
selectionSort2(intArray);
}
// 数组中交换i和j位置的数
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// 打印数组
public static <T> void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
public static void selectionSort2(int[] arr) {
printArray(arr);
if (arr == null || arr.length == 1) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int min = arr[i];
int minIndex = i;
for (int j = i; j < arr.length; j++) {
if (arr[j] <= min) {
min = arr[j];
minIndex = j;
}
}
swap(arr, i, minIndex);
printArray(arr);
}
}
打印如下
[6, 3, 2, 1, 5]
[1, 3, 2, 6, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 5, 6]
冒泡排序
从第一位开始,比较他和他后面的那一位数,大的往后,这样一轮下来,最大的数就到最后一位,下一轮最后一位数就不用参与了
public static void main(String[] args) {
int[] intArray = {6, 3, 2, 1, 5};
bubbleSort2(intArray);
}
// 数组中交换i和j位置的数
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// 打印数组
public static <T> void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
public static void bubbleSort2(int[] arr) {
printArray(arr);
if (arr == null || arr.length == 1) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
printArray(arr);
}
}
打印如下
[6, 3, 2, 1, 5]
[3, 2, 1, 5, 6]
[2, 1, 3, 5, 6]
[1, 2, 3, 5, 6]
[1, 2, 3, 5, 6]
插入排序
其实就是从 2 位开始,每次都把它和前面的数比较,如果比它大,就交换,如果比它小,说明前面的都比它小,因为前面的已经排完序了,就停止。
public static void main(String[] args) {
int[] intArray = {6, 3, 2, 1, 5};
insertionSort2(intArray);
}
// 数组中交换i和j位置的数
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// 打印数组
public static <T> void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
public static void insertionSort2(int[] arr) {
printArray(arr);
if (arr == null || arr.length == 1) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j-1]) {
swap(arr, j, j-1);
} else {
break;
}
}
printArray(arr);
}
}
打印如下
[6, 3, 2, 1, 5]
[3, 6, 2, 1, 5]
[2, 3, 6, 1, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 5, 6]