排序算法之---插入排序(看完不懂来打我呀呀)

2023-10-14 06:30

本文主要是介绍排序算法之---插入排序(看完不懂来打我呀呀),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、插入排序

还是那句话:不是常用的我不说,实用才是王道。

算法基本思想:

  • 一个未排序的数组(也可以是链表)可以分为两个部分,前半部分是已经排序的,后半部分是未排序的。
  • 在进行未排序时,只需要在未排序的部分中选择一个元素,将其插入到前面有序的数组中即可(找到合适的位置插入)
  • 直到未排序的为0,则排序完成。

二、直接上代码:(会的就不用看第三部分了)

Java老大哥:

package suanFa;
/*** 插入排序,时间复杂度O(n^2)*/import java.util.Arrays;public class insertSort {public static void insertSort1(int[] arr){int length = arr.length;int i, j, key;//数组第一个默认为有序for(i = 1; i < length; i++){	//key为要准备插入的元素key = arr[i];j = i - 1;while(j >= 0 && arr[j] > key){arr[j+1] = arr[j];j--;}//找到合适的位置插入keyarr[j+1] = key;}}public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = {5,3,1,0};System.out.println("未开始插入前:"+Arrays.toString(arr));insertSort1(arr);System.out.println("插入完成后:"+Arrays.toString(arr));}
}

Python新竞老大哥:

"""排序算法之--插入排序"""
def insertSort(list):length = len(list)for i in range(1,length):  #未排序的序列从第二个开始往后遍历for j in range(i, 0, -1): #已排序的从后往前遍历if list[j] < list[j - 1]: # 如果当前元素小于前一个元素, 则交换元素位置#列表直接这样交换两个值是可以的list[j - 1], list[j] = list[j], list[j - 1]else:  #如果大于前一个元素,则保持位置不变break
if __name__ == "__main__":list = [6,3,1,0]print(list)insertSort(list)print(list)

三、分析如下:(提供给不是很理解的小朋友)

假设数组arr由下图所示
在这里插入图片描述
考虑到篇幅的原因,我这里直接带你跑一遍 java算法程序。我保证:如果你跟着走一遍,还不会,那就是我蠢了(哈哈哈,开玩笑啦啦啦,哪有这么说自己的)

  1. 首先用i, j ,key 三个变量分别来表示:无序部分的下标有序部分的下标无序部分准备要插入的元素
  2. 看图,可以知道,无序部分的下标是从:1 - 数组长度减一
  3. 有序部分的下标是:0 到 i - 1(这里需要稍微想想:无序部分的起始坐标减掉1就是有序部分的最后坐标)

上面的懂了之后:下面就好办了:走进程序的世界了解一下

  1. 取无序第一个暂存在key中,即(key = arr[i])
  2. 往下j = 0 (这里保存的是有序下标的最后坐标)
  3. 进入while循环:j=0且5>3符合条件,进入循环内部
  4. 将arr[0]处的值(a[j] = 5),赋值给arr[1] (arr[ j+1 ] )
  5. j减减后值为-1,不符合while循环条件,退出循环体
  6. 程序继续往下走,j+1 = 0,所以将key的值赋给arr[0]
  7. 这样就把无序中的3成功插入到 有序中了
  8. 然后程序继续for循环,直到无序部分完成。
四、分享结束

最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!

  1. Java web从入门到精通电子书

  2. Python机器学习电子书

  3. Python400集(北京尚学堂)

  4. JavaScript项目案例、经典面试题

  5. Java300集(入门、精通)

  6. Java后端培训机构录集(同事培训内部提供)

在这里插入图片描述

这篇关于排序算法之---插入排序(看完不懂来打我呀呀)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/208756

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int