(2)过程演示
![面试官:手撕十大排序算法,你会几种?](http://img.jiangsulong.com/220407/06302431U-3.jpg)
文章插图
(3)代码实现
public class InsertSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的for (int i = 1; i < arr.length; i++) {// 记录要插入的数据int tmp = arr[i];// 从已经排序的序列最右边的开始比较,找到比其小的数int j = i;while (j > 0 && tmp < arr[j - 1]) {arr[j] = arr[j - 1];j--;}// 存在比其小的数,插入if (j != i) {arr[j] = tmp;}}return arr;}}
希尔排序(Shell Sort)希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本 。但希尔排序是非稳定排序算法 。希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
(1)算法步骤
步骤1:选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;步骤2:按增量序列个数 k,对序列进行 k趟排序;步骤3:每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序 。仅增量因子为 1时,整个序列作为一个表来处理,表长度即为整个序列的长度;(2)过程演示
![面试官:手撕十大排序算法,你会几种?](http://img.jiangsulong.com/220407/0630243948-4.jpg)
文章插图
(3)代码实现
public class ShellSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);int gap = 1;while (gap < arr.length) {gap = gap * 3 + 1;}while (gap > 0) {for (int i = gap; i < arr.length; i++) {int tmp = arr[i];int j = i - gap;while (j >= 0 && arr[j] > tmp) {arr[j + gap] = arr[j];j -= gap;}arr[j + gap] = tmp;}gap = (int) Math.floor(gap / 3);}return arr;}}
归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效的排序算法 。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 。归并排序是一种稳定的排序方法 。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序 。若将两个有序表合并成一个有序表,称为2-路归并 。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度 。代价是需要额外的内存空间 。
(1)算法步骤
步骤1:把长度为n的输入序列分成两个长度为n/2的子序列;步骤2:对这两个子序列分别采用归并排序;步骤3:将两个排序好的子序列合并成一个最终的排序序列;(2)过程演示
![面试官:手撕十大排序算法,你会几种?](http://img.jiangsulong.com/220407/06302433H-5.jpg)
文章插图
(3)代码实现
public class MergeSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);if (arr.length < 2) {return arr;}int middle = (int) Math.floor(arr.length / 2);int[] left = Arrays.copyOfRange(arr, 0, middle);int[] right = Arrays.copyOfRange(arr, middle, arr.length);return merge(sort(left), sort(right));}protected int[] merge(int[] left, int[] right) {int[] result = new int[left.length + right.length];int i = 0;while (left.length > 0 && right.length > 0) {if (left[0] <= right[0]) {result[i++] = left[0];left = Arrays.copyOfRange(left, 1, left.length);} else {result[i++] = right[0];right = Arrays.copyOfRange(right, 1, right.length);}}while (left.length > 0) {result[i++] = left[0];left = Arrays.copyOfRange(left, 1, left.length);}while (right.length > 0) {result[i++] = right[0];right = Arrays.copyOfRange(right, 1, right.length);}return result;}}
快速排序(Quick Sort)快速排序是由东尼·霍尔所发展的一种排序算法 。在平均状况下,排序n个项目要 Ο(n log n) 次比较 。在最坏状况下则需要 Ο(n^2) 次比较,但这种状况并不常见 。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来 。
推荐阅读
- 南安石井芯谷七星湾楼盘业主反映无法交房,官方回复!
- 我国最早的军官学校出现在哪个年代 我国历史上最早的军官学校是
- 苹果官网ipadair3下架了吗 为什么ipad air3官网下架了
- 和平精英|iPhone 13 Pro系列跑不满《和平精英》90帧?官方回答来了
- 在古代有专门负责茶的官员你明白吗
- 晴雯的判词的理解 都判官为什么怕宝玉
- 官庄毛尖茶文化历史记载
- 微信7.0.6版本官方版 微信炸屎安卓手机为什么没有
- 人体的五大器官是哪五大器官 人体的六大器官是哪些
- 一道简单面试题引出的Java数据类型连环问