六大常用排序算法--插入算法

插入算法

顾名思义,插入算法就是将元素插入到合适位置,以此来完成排序任务。

步骤

tip:按照升序排列

  1. 将待排序数组 arrays 中的第一位当作已经完成排序任务的序列,记作 sortArrays。 此时为了方便讲解,将原本的序列分为了两组,但实际上还是在同一个数组中。
  2. 此时待排序数组 arrays 中的第一位已经完成排序,取 arrays 中的下一个元素,与已经排序完成的序列 sortArrays 从后往前比较。
  3. 如果待比较的 sortArrays 的元素大于 arrays 取出的元素,则将该元素移动到下一位,同时 arrays 的待比较元素继续与 soutArrays 的前一个元素作比较。
  4. 重复该步骤。

图解

代码实现

如果此时还没有想明白那么我们不妨对比着程序来完成理解。

// C
//方法的命名采用驼峰命名,同时首字母小写,好的命名规范是写好程序的前提。
void sortArrays(int* arrays, int n)
//arrays是待排序数组,n为数组的长度。
{
	for (int i = 0; i < n - 1; ++i) //由于有n个元素,我们只需要循环执行n-1次就可以将所有的元素完成排序。
	{
		//记录完成排序的有序序列最后一个元素的下标,每次比较从该下标开始比较。
		int arraryEnd = i;
		//获取待插入的元素
		int tem = arrays[arraryEnd + 1];
		//开始进行单趟排序,把有序数列的元素个数作为比较次数
		while (arraryEnd >= 0)
		{
			//比较,如果有序数组的元素大就向后移东,不断进行覆盖。
			if (tem < arr[arraryEnd])
			{
                //将已经排序完成的元素进行向后移动图解见图2;

				arr[arraryEnd + 1] = arr[arraryEnd];
				arraryEnd--;
			}
			//比插入的数小,跳出循环(一定要跳出循环)
			else
			{
				break;
			}
		}
        // 代码执行到此位置有两种情况:
		// 1.待插入元素找到应插入位置(break跳出循环到此)
		// 2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
        // 不管那种情况,将该元素插入该下标处,完成排序。
        arr[arraryEnd  + 1] = tem;
	}
}

图 2
将已经排序完成的元素进行向后移动的图解

由于最后一个元素已经赋值给变量 tem,所以再进行向后覆盖并不会造成数据丢失。

// Java
public void sortArrary(int[] arrarys){
    //由于有n个元素,我们只需要循环执行n-1次就可以将所有的元素完成排序。
    for(int i =0;i<arrarys.length-1;++i){
        //记录完成排序的有序序列最后一个元素的下标,每次比较从该下标开始比较。
        int end = i;
        //获取待插入的元素
        int tem = arrays[i+1];
        //开始进行单趟排序,把有序数列的元素个数作为比较次数
        while(end>0){
            if (tem < arr[end])
			{
                //将已经排序完成的元素进行向后移动图解见图2;
				arr[end + 1] = arr[end];
				end--;
			}
			//找到比插入的数小,跳出循环(一定要跳出循环)
			else
			{
				break;
			}
        }
        arr[end  + 1] = tem;

    }
}

posted @   喝茶谢谢  阅读(298)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示