从数组中选择最小元素,将它与数组的第一个元素交换位置。再从数组剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置。不断进行这样的操作,直到将整个数组排序。
动态过程
算法原理参考:图解选择排序。
代码实现
// 选择排序
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
int k = i;
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < arr[k]) {
k = j;
}
}
if (k != i) {
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
1|2冒泡排序
算法思想
从左到右不断交换相邻逆序的元素,在一轮的循环之后,可以让未排序的最大元素上浮到右侧。在一轮循环中,如果没有发生交换,那么说明数组已经是有序的,此时可以直接退出。
算法原理参考:图解冒泡排序。
代码实现
// 冒泡排序
public static void bubbleSort(int[] arr) {
// 设置每次冒泡的终止点
for (int i = arr.length-1; i > 0; i--) {
boolean change = false;
// 从起点开始冒泡
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
if (change == false) {
change = true;
}
}
}
// 如果本次无交换,则表示已有序,排序完成
if (!change) {
return;
}
}
}
1|3插入排序
算法思想
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。
算法原理参考:图解插入排序。
代码实现
// 插入排序
public static void insertionSort(int[] arr) {
// 从第二个元素开始为它们找位置
for (int i = 1; i < arr.length; i++) {
// 记住当前元素
int temp = arr[i];
int j;
// 从当前元素左边第一个元素开始,向左找位置
for (j = i-1; j >= 0 && arr[j] > temp; j--) {
arr[j+1] = arr[j];
}
// 找到合适位置后,将当前元素插入
arr[j+1] = temp;
}
}
1|4希尔排序
算法思想
又称“分组插入排序”