那么这一篇文章,就分享一下今天学到的两个排序算法吧。
冒泡排序
什么是冒泡排序呢?
冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过重复比较相邻的元素,并根据需要交换它们的位置,使得较大的元素逐步“冒泡”到序列的末端。由于每次遍历都将未排序部分的最大元素移动到正确的位置,因此称为“冒泡排序”。
冒泡排序的工作原理
- 初始状态:从序列的第一个元素开始,依次比较相邻的两个元素。
- 比较与交换:
- 如果前一个元素比后一个元素大,则交换它们的位置。
- 否则,保持不变。
- 遍历一轮:完成一轮比较后,序列中最大的元素被移动到序列的末端。
- 重复过程:对剩下的未排序部分重复上述过程,直到整个序列有序。
下面是今天我做的一道例题,通过循环遍历进行比较,得出一个升序的新数组,然后将它打印在控制台上,感兴趣的小伙伴可以copy一下试试哦。
/*
冒泡排序
相邻的两个元素进行比较,小的放左边大的放右边,完成升序排列
实现步骤
确定总共需要做几轮: 数组长度-1
每轮比较几次: 轮数从0计数的话, 就是数组长度-1-当前轮数
比较规则: 相邻两个元素比较,大的放在右边
*/
public class Demo1 {
public static void main(String[] args) {
int[] arr = {5, 2, 3, 1};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {
//轮数
for (int i = 0; i < arr.length - 1; i++) {
//第i轮比较
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
接下来,我说一下冒泡排序的时间空间复杂度和它的优缺点吧。
冒泡排序的时间复杂度
- 最坏情况(数组按降序排列):需要进行最多的交换,时间复杂度为 O(n²)。
- 最好情况(数组已经有序):只需进行一次遍历,无需交换,时间复杂度为 O(n)。
- 平均情况:时间复杂度为 O(n²)。
冒泡排序的空间复杂度
- 空间复杂度:冒泡排序是一种原地排序算法,只需常数级别的额外空间,空间复杂度为 O(1)。
冒泡排序的优缺点
优点:
- 实现简单,易于理解和编写。
- 对于已经基本有序的数组,效率较高(最佳时间复杂度为 O(n))。
缺点:
- 时间复杂度较高,尤其是对于大规模数据,效率较低。
- 不适合处理大数据集。
等后面深入学习会给大家更新冒泡算法的优化代码di。
那么,就到了今天的第二个算法了。
选择排序
什么是选择排序呢?
选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从未排序的部分中选择出最小(或最大)的元素,放到已排序部分的末尾,直到整个数组有序。
选择排序的基本思想:
- 将数组分为已排序和未排序两部分。
- 每一轮从未排序的部分中选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置。
- 随着每一轮的执行,已排序部分逐渐扩大,未排序部分逐渐缩小,直到整个数组排序完成。
选择排序的步骤:
- 初始状态:已排序部分为空,未排序部分为整个数组。
- 第1轮:在未排序部分中找到最小元素,将其与未排序部分的第一个元素交换位置。此时,已排序部分包含一个元素,未排序部分缩小一个元素。
- 第2轮:在未排序部分中找到最小元素,将其与未排序部分的第一个元素交换位置。已排序部分增加一个元素,未排序部分继续缩小。
- 重复上述过程,直到未排序部分只剩一个元素,排序完成。
同样,给大家展示一段我今天写的一段小代码。
/*
选择排序
每轮选择当前位置,开始找后面的最小值,与当前位置交换
关键点分析
确定总共需要做几轮: 数组长度-1
每次的基准位:轮数从0计数的话, 就是基准位索引敲好就是轮数
比较规则: 以每次的第一个为基准做比较,谁小谁来基准位
*/
public class Demo2 {
public static void main(String[] args) {
int[] arr = {5, 2, 3, 1};
selectionSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
}
和冒泡算法一样,向大家输出一点选择排序的特点和优缺点。
选择排序的特点:
- 时间复杂度:无论输入的数组是否有序,选择排序的时间复杂度始终为 O(n2)O(n^2)O(n2),因为每一轮都需要在未排序部分找到最小元素并交换位置。
- 空间复杂度:空间复杂度为 O(1)O(1)O(1),因为选择排序是原地排序算法,只需要常量级别的额外空间。
- 稳定性:选择排序不是稳定排序,因为在选择最小元素并交换时,可能会改变相同元素的相对顺序。
选择排序的优缺点:
- 优点:
- 实现简单,易于理解。
- 比冒泡排序交换操作次数少,因此当交换操作较昂贵时,选择排序可能比冒泡排序更优。
- 缺点:
- 时间复杂度较高,对于大规模数据集不够高效。
- 不稳定,可能会破坏相同元素的相对顺序。
以上呢,就是今天学习到的两种算法,跟大家简单的介绍一下,希望咱们各位能够早日成为大牛,然后顶峰相见!