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

Java手写插入排序和算法案例拓展

1. Java手写插入排序和算法案例拓展

1.1 算法思维导图

插入排序
比较相邻元素
是否需要交换
交换元素
结束
结束

1.2 手写插入排序的必要性

手写插入排序是为了更好地理解算法的原理和实现过程。通过手写插入排序,我们可以深入思考每个步骤的逻辑,优化算法的性能,并且能够更好地应用到实际问题中。

1.3 插入排序的市场调查

插入排序是一种简单直观的排序算法,适用于小规模数据的排序。在实际应用中,插入排序常用于对已经基本有序的数据进行排序,或者用作其他排序算法的优化部分。它的时间复杂度为O(n^2),对于大规模数据的排序效率较低,但在某些特定场景下仍然有较好的应用效果。

1.4 插入排序的详细介绍和步骤

插入排序的基本思想是将待排序的元素依次插入到已排序序列中的合适位置,从而得到一个新的有序序列。具体步骤如下:

  1. 首先,将待排序序列的第一个元素看作已排序序列,将其作为参照物。
  2. 然后,从待排序序列的第二个元素开始,依次与已排序序列中的元素进行比较。
  3. 如果待排序元素小于已排序元素,则将已排序元素后移一位,为待排序元素腾出位置。
  4. 重复步骤3,直到找到待排序元素的正确位置。
  5. 将待排序元素插入到正确位置后,已排序序列的长度加1。
  6. 重复步骤2~5,直到待排序序列中的所有元素都插入到已排序序列中。

下面是插入排序的Java代码实现:

public class InsertionSort {public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}
}

代码解释:

  • insertionSort函数接受一个整型数组作为参数,对数组进行插入排序。
  • 首先,获取数组的长度,并从数组的第二个元素开始遍历。
  • 将当前元素保存为key,并将j初始化为当前元素的前一个位置。
  • while循环中,如果j大于等于0且当前元素大于key,则将当前元素后移一位。
  • 重复上述过程,直到找到当前元素的正确位置。
  • key插入到正确位置后,继续下一个元素的排序。
  • 最后,数组中的所有元素都被插入到正确位置,排序完成。

1.5 插入排序的手写实现总结和必要性

通过手写插入排序,我们更深入地理解了算法的原理和实现步骤。手写实现可以帮助我们更好地掌握算法的细节,从而能够优化算法的性能和适应不同的应用场景。同时,手写实现也有助于我们在面试等场合展示自己的编码能力和对算法的理解。

1.6 插入排序的完整代码

public class InsertionSort {public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void main(String[] args) {int[] arr = {5, 2, 8, 9, 1};insertionSort(arr);for (int num : arr) {System.out.print(num + " ");}}
}

1.7 插入排序的应用前景调研

插入排序由于其简单直观的特点,在某些特定场景下仍然有较好的应用前景。以下是插入排序的一些应用前景:

  • 对小规模数据进行排序:插入排序在数据规模较小时,由于其时间复杂度为O(n^2),相对于其他高效排序算法(如快速排序、归并排序)来说,性能较好。
  • 部分有序数据的排序:对已经基本有序的数据进行排序时,插入排序的性能优于其他排序算法,因为插入排序每次只需要移动少量元素。
  • 排序算法的优化部分:插入排序可以作为其他排序算法的优化部分,例如快速排序的优化版本(快速排序+插入排序)。

1.8 插入排序的拓展应用案例

案例1:对学生成绩进行排序

假设有一批学生的成绩数据,需要按照从低到高的顺序进行排序。由于学生人数较少,可以使用插入排序进行排序。

public class Student {private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}public String getName() {return name;}public int getScore() {return score;}public static void insertionSort(Student[] students) {int n = students.length;for (int i = 1; i < n; i++) {Student key = students[i];int j = i - 1;while (j >= 0 && students[j].getScore() > key.getScore()) {students[j + 1] = students[j];j--;}students[j + 1] = key;}}public static void main(String[] args) {Student[] students = {new Student("Alice", 80),new Student("Bob", 90),new Student("Charlie", 70)};insertionSort(students);for (Student student : students) {System.out.println(student.getName() + ": " + student.getScore());}}
}

案例2:插入排序的优化

在插入排序中,每次比较都需要进行交换操作,这样会导致大量的数据移动。为了减少数据移动的次数,可以将交换操作改为赋值操作。

public class InsertionSort {public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void insertionSortOptimized(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}public static void main(String[] args) {int[] arr = {5, 2, 8, 9, 1};insertionSortOptimized(arr);for (int num : arr) {System.out.print(num + " ");}}
}

在优化后的插入排序中,每次比较只需要进行赋值操作,不需要进行交换操作,从而减少了数据移动的次数,提高了排序的效率。

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

相关文章:

  • Python Opencv实践 - 视频文件操作
  • HCS 中的一些概念(二)
  • Scanner类用法(学习笔记)
  • idea2021.1.3版本双击启动,没反应
  • MC-4/11/01/400 ELAU 软件允许用户完全访问相机设置
  • Error contacting service. It is probably not running.问题解决
  • 01_网络编程_传统IO
  • vue 检查指定路由是否存在
  • 自动化办公更简单了:新版python-office,有哪些更新?
  • windows flask服务卡死的问题
  • 项目上线部署--》服务器部署流程(一)
  • Python:函数调用的实参
  • 174. 地下城游戏 -- 动规
  • js实现websocket服务端和客户端
  • qt qml RadioButton如何设置字体颜色,style提示找不到怎么办?
  • Docker 的使用
  • 【无公网IP内网穿透】Java支付宝沙箱环境支付,SDK接口远程调试
  • axios 用formData的方式请求数据
  • Mapbox加载arcgis的底图
  • (20)线程安全问题:Lock,双锁问题,Monitor,死锁
  • 医院如何实现安全又稳定的跨网文件数据交换呢?
  • 关于老项目从JDK8升级到JDK17所需要注意的细节
  • 《C++ primer》练习3.43-3.45: 打印二维数组的元素
  • 使用电力系统稳定器 (PSS) 和静态 VAR 补偿器 (SVC) 提高瞬态稳定性(Matlab代码实现)
  • 开源项目-SeaTunnel-UI数据集成系统
  • 百度SEO优化策略与经验分享(提升百度排名的8大步骤)
  • 【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题
  • 力扣236 补9.14
  • 一文搞定Postman(菜鸟必看)
  • 位图+布隆过滤器+海量数据并查集(它们都是哈希的应用)