一、冒泡排序(Bubble Sort)
动图转载自Github作者hustcc
● 基础版本
/**
* 静态方法:冒泡排序算法
*/
public static void sort(Comparable[] arr) {
// 外层循环控制每趟排序
for (int i = 0; i < arr.length - 1; i++) {
// 内层循环控制元素交换
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j].compareTo(arr[j + 1]) > 0) {
swap(arr, j, j + 1);
}
}
}
}
● 优化版本
基础版本会按照最保险的策略进行排序,所以可能产生无意义的趟数
优化后的版本一旦确定数组排序完成,便会立刻结束排序
/**
* 静态方法:优化的冒泡排序算法
*/
public static void sort(Comparable[] arr) {
int n = arr.length;
boolean flag = false;
do {
flag = false;
for (int i = 0; i < n - 1; i++) {
if (arr[i].compareTo(arr[i + 1]) > 0) {
swap(arr, i, i + 1);
// 如果当前轮次发生了交换,则说明数组尚未排序完成,激活flag
flag = true;
}
}
// 每趟排序都会决定出一个最大值,故可以减少下一次排序的元素数量
n--;
} while (flag);
}
假设现有数组Integer arr[] = {1, 2, 3, 4, 5, 6}需要进行升序排序,但目前的数组已经是升序状态了,如果使用标准版本的排序算法,还是会进行5趟排序,而优化版本在第一轮的时候就会判定已排序完毕并结束。
二、选择排序(Selection Sort)
动图转载自Github作者hustcc
/**
* 静态方法:选择排序算法
*/
public static void sort(Comparable[] arr) {
// 外层循环遍历每一个元素
for (int i = 0; i < arr.length; i++) {
// 默认当前位置的元素索引为minIndex
int minIndex = i;
// 内层循环从当前位置起开始遍历
for (int j = i + 1; j < arr.length; j++) {
// 如果有元素比minIndex元素还要小,则更新minIndex的值
if (arr[j].compareTo(arr[minIndex]) < 0) {
minIndex = j;
}
}
// 将最小的元素与起始元素交换
swap(arr, i, minIndex);
}
}
三、插入排序(Insertion Sort)
动图转载自Github作者hustcc
/**
* 静态方法:插入排序算法
*/
public static void sort(Comparable[] arr) {
// 外层循环遍历数组的每一个位置
for (int i = 0; i < arr.length; i++) {
// 将arr[i]的值拷贝一份
Comparable e = arr[i];
int j;
// 内层循环从当前元素开始往前查询
// 如果有元素的值比e大,则将其往后拷贝
for (j = i; j > 0 && arr[j - 1].compareTo(e) > 0; j--) {
arr[j] = arr[j - 1];
}
// 查询结束后,将e的值放入它最终的位置
arr[j] = e;
}
}