前言
冒泡和选择排序比较类似,但是计算的次数不同,冒泡要比选择多的多,时间复杂度都是 O(n^2),插入排序和前两个有很大区别,它的时间复杂度为 O(n^1/2)。
这三个都是比较基础的排序算法,虽然在实际写工程的时候我们不用去写排序算法,但是还是要了解基础的排序算法思想,打好基础以后才能创建算法。项目中一般用 Arrays.sort(),用的是快速排序。
冒泡排序
思想: 双重循环,外层是总共比较多少伦,内层是每轮比较的次数。
private static void BubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
选择排序
思想: 双层循环,外层是比较的轮次,内层是每轮比较的次数
和冒泡不同的是,每轮比较会将最小值的下标赋给 min, 在外层循环比较 min 和 i 来决定是否交换.
private static void choiceSort(int[] arr) {
int min = 0;
for (int i = 0; i < arr.length; i++) {
min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j])
min = j;
}
if (min != i) {
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
插入排序
思想: 插入排序的思想比较特殊, 它假设数组是排好序的,使用两个指针,一个是遍历数组,
一个是从数组最前方进行插入。
private static void insertSort(int[] arr) {
// 数组是向后的,插入是向前的
for (int i = 0; i < arr.length; i++) {
// 假设下标 0 --> i - 1 都是排好序的
// 拿到新的元素 i,将其插入到 0 --> i - 1 之间
int lastIndex = i - 1;
int v = arr[i];
while (lastIndex >= 0 && v < arr[lastIndex]) {
arr[lastIndex + 1] = arr[lastIndex];
lastIndex--;
}
arr[lastIndex + 1] = v;
}
}