Java算法实现-直接插入排序
2017-07-01 01:31
330 查看
直接插入排序
定义:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 —–来自百度词条
当然了英文毫无压力的兄弟可以参考一下这里:
https://en.wikipedia.org/wiki/Insertion_sort
个人觉得首先不去考虑一个算法的时间复杂度与空间复杂度,单从应用场景上会让人更好理解
比如大家都有在学校课间操按身高(暂且默认升序)排成一列的经历,通常是后一个同学C与前一个同学B做比较,如果B的身高>C的身高,则前一个同学B的位置后移,否则保持位置不变; 之后C同学继续与前面的同学A的身高做比较,执行内部循环;
假设现在给定一个数组{171,163,178,184,172,168,190,175,161,160,185} 代表学生的身高
JAVA实现插入排序:
= 0; j--) { //内部循环,依次与前一名同学做身高比较 if (arrays[j] > back) { //如果前一名同学的身高大于当前同学的身高 arrays[j + 1] = arrays[j]; //前一名同学后移一位 } else { break; // } arrays[j] = back; //后一名同学(也就是当前同学)移动至前一位 } } return arrays; }" data-snippet-id="ext.4d8dbb1743e7ba66af0c7902898a08b8" data-snippet-saved="false" data-codota-status="done">[code] public static int[] insertSort(int[] arrays) { int back; //标记位 for (int i = 1; i < arrays.length; i++) { //从第二个同学开始 back = arrays[i]; //记录当前同学(的身高) for (int j = i - 1; j >= 0; j--) { //内部循环,依次与前一名同学做身高比较 if (arrays[j] > back) { //如果前一名同学的身高大于当前同学的身高 arrays[j + 1] = arrays[j]; //前一名同学后移一位 } else { break; // } arrays[j] = back; //后一名同学(也就是当前同学)移动至前一位 } } return arrays; }
public static void main(String[] args) { int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ; int[] insertSort = insertSort(arrays); for (int i = 0; i < insertSort.length; i++) { System.out.println(insertSort[i]); } }
打印结果:
160
161
163
168
171
172
175
178
184
185
190
再补充一个例子: 比如某个同学迟到进队
= 0; j--) { if (newArarrys[j] > back) { newArarrys[j + 1] = newArarrys[j]; } else { break; } newArarrys[j] = back; } } return newArarrys; }" data-snippet-id="ext.c44b6a8529aa4737b37e71b68a66a83d" data-snippet-saved="false" data-codota-status="done">[code] public static int[] insertSort(int[] arrays, int x) { int[] newArarrys = new int[arrays.length + 1]; newArarrys[newArarrys.length - 1] = x; System.arraycopy(arrays, 0, newArarrys, 0, arrays.length); int back; for (int i = 1; i < newArarrys.length; i++) { back = newArarrys[i]; for (int j = i - 1; j >= 0; j--) { if (newArarrys[j] > back) { newArarrys[j + 1] = newArarrys[j]; } else { break; } newArarrys[j] = back; } } return newArarrys; }
运行:
public static void main(String[] args) { int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ; int[] insertSort = insertSort(arrays,170); for (int i = 0; i < insertSort.length; i++) { System.out.println(insertSort[i]); } }
打印结果:
160
161
163
168
170
171
172
175
178
184
185
190
最后在补个动图:
相关文章推荐
- Java算法 直接插入排序
- 经典排序算法-MFC实现之4:直接插入排序
- 直接插入排序的C++实现代码
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
- 白话经典算法系列之二 直接插入排序的三种实现
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 直接插入排序java实现
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
- 直接插入排序的三种实现
- 直接插入排序、折半插入排序、2-路插入排序实现
- C语言实现直接插入排序
- 插入排序之直接插入排序(java实现)
- 直接插入排序、快速排序和堆排序的C实现
- 直接插入排序(JAVA实现)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 用JAVA实现排序算法之二:直接插入排序
- 插入排序--直接插入排序[Java实现]
- 直接插入排序(C++模版技术实现)
- python 实现的 直接插入排序法
- mips程序设计——直接插入排序的递归与非递归实现(spim模拟)