- 选择排序
第一个元素和其他位置相比,如果小于第一个元素则更新最小索引,比较完成之后交换位置。即可在数组头部获得最小值,依次执行下去,即可完成排序
- 冒泡排序
从第一个位置开始跟下一个元素比较,若小于其值,则交换位置,直到最后一个元素,这样就在数组末尾得到了最大值,依次比较之后即可排序
- 插入排序
原理类似于玩扑克牌时整理手牌的情景,我们手上的牌是有序的,将下一张牌插入到合适位置即可
代码实现:
public class a001_threeSillySorts {
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
System.out.println("原始数组:");
printArray(arr);
insertionSort(arr);
System.out.println("排序后的数组:");
printArray(arr);
}
//选择排序
/*
* 双指针
* 最小值索引和移动的索引
* */
public static void selectionSort(int[] arr) {
//边界
if (arr == null || arr.length < 2) {
return;
}
//最后一位数是不需要再比较的,所以i=arr.length-2是边界
for (int i = 0; i < arr.length - 1; i++) {
//假设最小值索引是i
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
//如果有更小的值,则更新索引
minIndex = j;
}
}
//循环完毕,即比较完之后再交换位置
swap(arr, i, minIndex);
}
}
//冒泡排序
public static void bubbleSort(int[] arr) {
//边界
if (arr == null || arr.length < 2) {
return;
}
//与选择排序相反,冒泡排序先排好的是最大位置的数,再去排未排序的数组
for (int end = arr.length - 1; end > 0; end--) {
for (int i = 0; i < end; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
//插入排序
public static void insertionSort(int[] arr) {
//边界
if (arr == null || arr.length < 2) {
return;
}
//假设第一个元素有序,从第二个开始插入,
for (int i = 1; i < arr.length; i++) {
//从右向左开始比较,如果小了则交换位置,一直到j指针<0或者arr[j] <= arr[j + 1]时结束循环
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
swap(arr, j, j + 1);
}
}
}
//元素交换位置
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//打印数组
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}