当前位置: 首页 > news >正文

【数据结构和算法】排序算法

说明:以下排序如无特别说明,都是从小到大升序排序

1. 冒泡排序

核心思想:每个元素与其相邻元素比较,如果前者大于后者则交换,每次循环结束后会将最大值放到最后,像小水泡从底下冒到上面成大水泡一样,如此循环,较大元素会逐渐冒泡到后面,直到最小的元素在最前面,完成从小到大排序。

public static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length; i++) {// 注意由于是与下一个元素比较,故这里必须是 j < arr.length-i-1for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}}}
}

时间复杂度 O(n^2);空间复杂度O(1);不稳定排序;原地排序

优化:

public static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length; i++) {// 增加一个是否需要继续的标志boolean flag = false;for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;flag = true;}}// 比较一轮后发现所有元素都无需交换,即认为本来是有序的if (!flag) {break;}}
}

2. 选择排序

核心思想:对长度为 n 的数组,循环 n-1 次,每次循环将当前元素与后面的元素比较找出最小元素并交换。
常规思路一:比较时交换

public static void selectSort1(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIndex;for (int j = i + 1; j < arr.length; j++) {// 如果比当前元素小,就交换if (arr[j] < arr[i]) {minIndex = j;int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}}
}

优化思路二:比较完成后再交换

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[j] < arr[minIndex]) {minIndex = j;}}if (minIndex != i) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}
}

时间复杂度 O(n^2);空间复杂度O(1);不稳定排序;原地排序

3. 插入排序

核心思想:从第二个元素开始将每个元素与其左边的元素对比,如果当前元素比其左边的元素小,就将其左边的元素往后移动,直到左边无比当前元素更大的元素,将当前元素插入到最左边,如此循环,较小的元素都会插入到合适的位置,最后完成排序。
在这里插入图片描述

public static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int insertValue = arr[i];int insertIndex = i - 1;while (insertIndex >= 0 && insertValue < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];insertIndex--;}if (insertIndex + 1 != i) {arr[insertIndex + 1] = insertValue;}}
}

参考

[1] 十大基础算法

http://www.lryc.cn/news/111543.html

相关文章:

  • Error: Cannot find module ‘@babel/core’处理
  • K8S系列文章之 自动化运维利器 Fabric
  • flask--->CBV/模板/请求响应/session
  • Go语言基础:运算符、文件操作、接口、Packages、if else、for循环
  • 2308C++学习简单协程文档
  • C++笔记之从数组指针到函数数组指针(使用using name和std::function)
  • 【数据结构】常见的排序算法
  • CentOS 安装 Jenkins
  • 前端如何设置表格边框样式和单元格间距?
  • Ubuntu 22.04安装搜狗输入法
  • 【C++】初阶 --- 内联函数(inline)
  • VGGNet剪枝实战:使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型
  • 【iOS】GCD深入学习
  • Webpack开启本地服务器;HMR热模块替换;devServer配置;开发与生成环境的区分与配置
  • opencv 31-图像平滑处理-方框滤波cv2.boxFilter()
  • Kubernetes关于cpu资源分配的设计
  • Flink读取mysql数据库(java)
  • 小程序学习(五):WXSS模板语法
  • 注解 @JsonFormat 与 @DateTimeFormat 的使用
  • Python实现决策树算法:完整源码逐行解析
  • Linux文本三剑客---grep、sed、awk
  • 局域网VoIP网络电话测试
  • el-table 去掉边框(修改颜色)
  • redis与MongoDB的区别
  • CSS设置高度
  • 开源免费用|Apache Doris 2.0 推出跨集群数据复制功能
  • 【docker】docker-compose服务编排
  • EdgeBox_tx1_A200 PyTorch v1.9.0 环境部署
  • 【雕爷学编程】MicroPython动手做(33)——物联网之天气预报
  • 分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)