插入排序
插入排序分为直接插入排序和希尔排序
直接插入排序:
直接插入排序原理就是,假设前面n-1(n>=2)个元素已经排好序,现在要把第n个元素找到正确的位置并插入。
import java.util.Arrays; public class Main { static int[] array = {7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2,10,-3}; public static void main(String[] args) throws InterruptedException { System.out.println(Arrays.toString(array)); insertionSort(array); System.out.println(Arrays.toString(array)); } //插入排序 public static void insertionSort(int[] array){ int len = array.length; int counter = 1; for(int i=1;i<len;i++){ int temp = array[i]; //存储待排序的元素值 int insertPoint = i-1; //与待排序元素值作比较的元素的下标 while(insertPoint>=0 && array[insertPoint]>temp){ //当前元素比待排序元素大 array[insertPoint+1]= array[insertPoint]; //当前元素后移一位 insertPoint--; } array[insertPoint+1]= temp; //找到了插入位置,插入待排序元素 System.out.print("第"+counter+"轮排序结果:"); display(array); counter++; } } private static void display(int[] array){ System.out.println(Arrays.toString(array)); } }

[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3] 第1轮排序结果:[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3] 第2轮排序结果:[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3] 第3轮排序结果:[6, 7, 8, 9, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3] 第4轮排序结果:[1, 6, 7, 8, 9, 4, 3, 2, 5, 0, -1, -2, 10, -3] 第5轮排序结果:[1, 4, 6, 7, 8, 9, 3, 2, 5, 0, -1, -2, 10, -3] 第6轮排序结果:[1, 3, 4, 6, 7, 8, 9, 2, 5, 0, -1, -2, 10, -3] 第7轮排序结果:[1, 2, 3, 4, 6, 7, 8, 9, 5, 0, -1, -2, 10, -3] 第8轮排序结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, 10, -3] 第9轮排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2, 10, -3] 第10轮排序结果:[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -2, 10, -3] 第11轮排序结果:[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -3] 第12轮排序结果:[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -3] 第13轮排序结果:[-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
希尔排序:实质就是分组插入排序,该方法又称缩小增量排序
原理:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
比如一个长度为12的数组,
第一步就是分成增量为6的小数组,一共6个,每一个都含有2个元素,对每一个小数组都进行直接插入排序
第二步就是将数组分成增量为3的小数组,一共有4个,每个都含有3个元素,对每个小数组都进行直接插入排序
第三步就是将整个数组进行直接插入排序。
分别是12/2=6,6/2=3,3/2=1,增量为1时,其实就是对整个数组进行操作。
==========================================
如果是奇数怎么办呢?
比如一个长度为13的数组
第一步还是分成增量为6的小数组,一共6个,但是第一个小数组会有3个元素,其他的分别有两个,然后对每个小数组进行直接插入排序
第二步分成增量为3的小数组,一共有4个,但是第一个小数组有5个元素,其他的分别有4个元素,然后对每个小数组进行直接插入排序
第三步就是将整个数组进行直接插入排序。
============================================
import java.util.Arrays; public class Main { static int[] array = {7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2,-3}; public static void main(String[] args) throws InterruptedException { System.out.println(Arrays.toString(array)); shellSort(array); System.out.println(Arrays.toString(array)); } static void shellSort(int a[]) { int n=a.length; int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) //步长 { for (i = 0; i < gap; i++) //直接插入排序 { for (j = i + gap; j < n; j += gap) { if (a[j] < a[j - gap]) { int temp = a[j]; int k = j - gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } System.out.print("增量:"+gap+" "); for(int k=i;k<n;k+=gap){ System.out.print(a[k]+"\t"); } System.out.println(""); } } } }

[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, -3] 增量:6 -3 3 7 增量:6 2 8 增量:6 5 9 增量:6 0 6 增量:6 -1 1 增量:6 -2 4 增量:3 -3 0 3 6 7 增量:3 -1 1 2 8 增量:3 -2 4 5 9 增量:1 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
http://blog.csdn.net/u012152619/article/details/47306209
http://blog.csdn.net/morewindows/article/details/6668714
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)