常见排序算法详解:冒泡排序、选择排序与插入排序
创作时间:
作者:
@小白创作中心
常见排序算法详解:冒泡排序、选择排序与插入排序
引用
CSDN
1.
https://blog.csdn.net/binbinxyz/article/details/145855705
排序算法是计算机科学中的基础问题之一,广泛应用于各种场景。本文将详细介绍三种常见的简单排序算法:冒泡排序、选择排序和插入排序。这些算法虽然在处理大规模数据时效率不如更复杂的算法(如快速排序、归并排序),但它们易于理解和实现,非常适合初学者学习和理解排序的基本原理。
1. 冒泡排序(Bubble Sort)
1.1 基本原理
冒泡排序通过重复地遍历要排序的列表,依次比较相邻的元素并交换它们的位置,使得每一轮遍历后最大的元素逐渐“冒泡”到列表的一端。
步骤:
- 从数组的第一个元素开始,依次比较相邻的两个元素。
- 如果前一个元素大于后一个元素,则交换这两个元素的位置。
- 重复上述过程,直到没有需要交换的元素为止。
1.2 时间复杂度
- 最好情况:O(n) (已经有序的情况)
- 平均和最坏情况:O(n^2)
1.3 空间复杂度
- O(1) (原地排序)
1.4 稳定性
- 稳定(相同值的相对位置不会改变)
1.5 Java 实现示例
public static void bubbleSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int length = arr.length - i;
boolean swap = false;
for (int j = 0; j < length; j++) {
// 交换元素以便将较大的元素冒泡
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swap = true;
}
}
if(!swap) {
break;
}
}
}
2. 选择排序(Selection Sort)
2.1 基本原理
选择排序每次从未排序部分中选出最小(或最大)的元素,并将其放到已排序部分的末尾。
步骤:
- 从未排序部分中找到最小的元素。
- 将该元素与未排序部分的第一个元素交换位置。
- 重复上述过程,直到整个数组排序完成。
2.2 时间复杂度
O(n^2)
2.3 空间复杂度
O(1) (原地排序)
2.4 稳定性
不稳定(相同值的相对位置可能会改变)
2.5 Java 实现示例
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
// 假定当前元素最小
int minIndex = i;
// 循环遍历未排序部分,查找最小元素的索引
for (int j = i + 1; j < arr.length; j++) {
if(arr[minIndex] > arr[j]) {
minIndex = j;
}
}
// 把最小元素挪到当前正确位置
if(minIndex > i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
3. 插入排序(Insertion Sort)
3.1 基本原理
插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
步骤:
- 从第二个元素开始遍历数组。
- 将当前元素与前一个元素进行比较,如果当前元素小于前一个元素,则交换它们的位置,并继续向前比较,直到找到正确的位置。
- 对每个元素重复上述步骤,直到整个数组排序完成。
3.2 时间复杂度
- 最好情况:O(n) (已经有序的情况)
- 平均和最坏情况:O(n^2)
3.3 空间复杂度
O(1) (原地排序)
3.4 稳定性
稳定(相同值的相对位置不会改变)
3.5 Java 实现示例
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
int key = arr[i];
// 比当前元素大的数往右移动
while(j > 0 && key < arr[j - 1]) {
arr[j] = arr[j - 1];
j --;
}
arr[j] = key;
}
}
4. 总结
4.1 各算法特点对比
排序算法 | 时间复杂度(最好) | 时间复杂度(平均) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
4.2 适用场景
- 冒泡排序和选择排序适合小规模数据集或几乎已排序的数据集。
- 插入排序在数据量较小或几乎已排序的情况下表现良好。
尽管这些排序算法在处理大规模数据时效率不如更复杂的算法,但它们的简单性和直观性使其成为初学者理解排序原理的理想选择。
热门推荐
辅警按劳动法规定进行劳动保障
肩关节不稳术后康复程序:从伤口护理到力量训练全攻略
有哪些超赞neovim插件(最好是c 的)
神经系统体格检查内容
聚焦金融大模型落地应用,上海金融科技论坛发布多项重磅成果
千万别吃错!心脏病突发时,阿司匹林、硝酸甘油、速效救心丸,哪种药才能救命?
德谟克利特:古希腊原子论的奠基者
轻钢结构房屋的优点
物业公司乱收费?这些部门可以管!
丽丽讲给孩子的数学:3 负负为何得正?
医师科普|大便颜色与健康:你需要知道的变化及原因解读
道教“三清”:元始天尊、灵宝道君与太上老君的地位解析
银禧庆典月季,经典大花赏繁花之美
儿童牙齿外伤多久能恢复?儿童牙齿外伤注意事项
企业社会责任:如何在追求利润的同时实现社会价值?
在天愿作比翼鸟,在地愿为连理枝。28句诗词,不言相思却尽染相思
怎样炖鸽子汤有营养又好吃,学会了你就是粤菜大师傅
仓鼠怎么分公的母的(仓鼠如何分辨公母)
如何在美国留学交互设计获取成功之路
2025年中国五谷杂粮产业链、市场现状、竞争格局及趋势研判:市场格局高度分散
川菜大师课:红油辣子终极配方!手把手教你熬出“饭店同款香辣红油”
警惕口头禅的隐形威胁:捍卫孩子独立,预防抑郁情绪
成年人不做选择题,变瘦和变强我都要!
綠色植物、洋蔥、蠟燭等 除甲醛方法有效嗎?
UVLED固化技术及其多波长应用详解
一文掌握UV LED在空净消杀领域的主要应用
研究揭示亚临床抑郁的应激反应特征及其对大脑网络的影响
马来西亚第二家园计划详解:发展历程、居民权利与项目优势
嚼口香糖的健康益处:促进健康饮食,保护牙釉质
成都周边藏着一座被遗忘的古城,2300多年历史,地铁公交可达!