首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序猿修仙之路--算法之插入排序

*直接插入排序是一种稳定的排序算法 假设排序顺序从左至右,具体步骤如下 1 列表第一个元素和前面元素比较,如果小于前面元素(其实不存在),则交换位置。...(这步其实可以没有) 2 列表第二个元素和前面元素第一个元素)比较,如果小于前面元素,则交换位置。 3 列表第三个元素和前面元素(第二个元素)比较,如果小于前面元素,则交换位置。...性能和特点 总体来说,直接插入排序是一种比较简单的排序算法,很容易理解也很好用代码实现,当然他的特点也很明显: 运行时间和数据初始状态有关 插入排序的思想是把一个元素插入一个有序的列表中,假如这个元素的位置正好是有序部分的末尾呢...大体可归纳为: 1 每个元素距离自己的最终位置都不远 2 一个有序的大列表连接一个小列表 3 列表中只有少数元素不正确 其他 为什么插入排序是稳定呢?...插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素

32530

极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

其次,排除弟中弟的选择排序,分析江山图得知冒泡排序和插入排序的时间复杂度,在最好情况和最坏情况下差了一个指数级别,这个地方有很大的优化空间让大神们发挥。...希尔排序 鉴于网上很多文章 上来就讲希尔排序是什么样的,但是都没有说明为什么会有这个版本排序,怎么演变过去的,所以这里我来分析一下,有不同的意见欢迎分享。...第三组这个自不用说,直接就是此数组的插入排序,画图解可真的费劲。 第一遍 ?...为什么说快排是冒泡排序的变种?...每次取数组第一个元素作为基准值 pivot,设定数组基准值 pivot 右边第一个数为mark用来存储比 pivot 小的元素,遍历数组; 遍历元素小于 pivot,将此元素放入mark位置,即此元素

46710
您找到你想要的搜索结果了吗?
是的
没有找到

排序算法-上(Java语言实现)

思考题:插入排序和冒泡排序的时间复杂度相同,都是 image.png ,在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢? 如何分析一个“排序算法”?...这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。...重复这个过程,直到未排序区间中元素为空,算法结束。 插入排序也包含两种操作,一种是元素的比较,一种是元素的移动。...解答开篇 基本的知识都讲完了,我们来看开篇的问题:冒泡排序和插入排序的时间复杂度都是 O(n2),都是原地排序算法,为什么插入排序要比冒泡排序更受欢迎呢?...但是在大规模数据排序的时候,这个时间复杂度还是稍微有点高,所以我们更倾向于用下一节要讲的时间复杂度为 O(nlogn) 的排序算法。 参考 11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?

32820

希尔排序原理

2、将待排序区的第一个元素向已排序区插入,将其与已排序区元素从后向前比较,将其插入到合适位置,已排序区元素个数+1。...我们明白了插入排序的过程,接下来就是实现插入排序了,我们先来分析,插入排序第一个元素(0位置处)本来就是有序的,所以我们直接从第二个元素开始操作(1位置处)。...3、再跟1比较发现大于1,那么这个值就插入在1和5之间,已排序元素加一,待排序数组元素减一。...我们对这个数组进行排序,首先假设设置gap的值为3,那么这组数就会分为三组: 接下来控制这三组,每组分别进行插入排序,结果为: 那么gap为3时的所有组已经排完了,接下来就该缩小增量了...与插入排序相同,定义一个end记录当前元素下标,定义一个tmp记录a[end + gap]处的值,为什么不是a[end]处的值?

11110

插入排序就这么简单

插入排序就这么简单 从上面已经讲解了冒泡和选择排序了,本章主要讲解的是插入排序,希望大家看完能够理解并手写出插入排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出。...将一个数据插入到已经排好序的有序数据中 将要排序的是一个乱的数组int[] arrays = {3, 2, 1, 3, 3}; 在未知道数组元素的情况下,我们只能把数组的第一个元素作为已经排好序的有序数据...i--; } //退出了循环说明找到了合适的位置了,将当前数据插入合适的位置中 arrays[i] = temp; } 上面的代码还缺少了一个条件...四、插入排序优化 二分查找插入排序的原理:是直接插入排序的一个变种,区别是:在有序区中查找新元素插入位置时,为了减少元素比较次数提高效率,采用二分查找算法进行插入位置的确定。...{ int temp = arr[i];//temp标记为未排序的第一个元素 while (i >= 0 &&

86180

python中对列表元素大小排序(冒泡排序法,选择排序法和插入排序法)—排序算法

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。...算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。...针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 2. 动图演示 不知道为什么图片上传不了,请点击下方阅读原文 3....算法步骤 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。...(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。) 2. 动图演示 不知道为什么图片上传不了,请点击下方阅读原文 3.

1.7K30

【算法入门】用Python手写五大经典排序算法,看完这篇终于懂了!

for i in range(1, len(array)): # 这个是我们想要放在正确位置的元素 key_item = array[i] #...选择pivot元素 为什么上面的实现会pivot随机选择元素?选择输入列表的第一个或最后一个元素会不会一样? 由于快速排序算法的工作原理,递归级别的数量取决于pivot每个分区的结尾位置。...如果输入数组未排序,则将第一个或最后一个元素用作,pivot将与随机元素相同。但是,如果输入数组已排序或几乎已排序,则使用第一个或最后一个元素作为pivot可能导致最坏的情况。...Python中的Timsort算法 最后这个算法就有意思了! 所述Timsort算法被认为是一种混合的排序算法,因为它采用插入排序和合并排序的最佳的两个世界级组合。...我们使用的内置sorted函数就是这个算法。 Timsort的主要特征是它利用了大多数现实数据集中存在的已排序元素。这些称为natural runs。

1.2K10

希尔排序

希尔排序 如果上一篇初级排序算法中的插入排序你已经熟悉,那么今天的这个希尔排序对你来说就要简单一些。希尔排序,就是使用不同增量进行一遍一遍的插入排序的排序算法。首先,增量是什么?...希尔排序的思想就是使数组中任意间隔为h的元素都要有序,间隔h就是增量,之所以叫他增量,是因为他是在不断变化的。...array[j-h] = temp; } } h=h/3; } } } 可以看到代码中h在第一个...第二个while循环中还有两个for循环,这两个for循环完成的就是间隔为h的插入排序第一个for循环的i从h移动到N,然后改变h的值再次循环,直到h减为1。...也许有人不理解为什么要间隔h,为什么要使用这个递增序列?速度确实可以提升吗?实验数据告诉我们,是的!希尔排序比之前初级排序算法中的排序算法都要快,并且,数组越大,优势越大。但为什么呢?

46530

极客算法训练笔记(五),十大经典排序之冒泡,选择,插入排序

为什么呢?稳定排序算法可以保持金额相同的两个对象,在排序之后的前后顺序不变。第一次排序之后,所有的订单按照下单时间从早到晚有序了。...重复(元素个数-1)次 把第一个没有排序过的元素设置为最小值 遍历每个没有排序过的元素 如果元素 < 现在的最小值 将此元素设置成为新的最小值 将最小值和第一个没有排序过的位置交换...如果你还是难以理解,那么举个栗子,比如4,6,4,2,7这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素2,与第一个5交换位置,那第一个4和中间的4顺序就变了,所以就不稳定 了。...否则:插入提取的元素 动图演示 插入排序 ?...在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样就可以保持原有的前后顺序不变,所以插入排序是稳定的排序算法。

52320

Python 排序-插入排序-优化

首先我们将待排序的数据分为两个区间,有序区间和无序区间,初始的有序区间只包含一个元素,也就是数组的第一个元素,其他的就是无序区间;然后,依次从无序区间中选取一个元素,在有序区间找到合适的插入位置将其插入...,并保证已排序区间的数据一直有序,最后重复这个过程,直到无序区间的元素为空,算法结束。...则插入最后元素位置的后面 ##如果小于第一个元素,则插入位置0 if data >= data_list [length -1]: return length,0 elif data...为了解决这个问题,希尔排序算法就产生了。 希尔排序是一种分组直接插入排序方法,其原理是:先将整个序列分割成若干小的子序列,再分别对子序列进行直接插入排序,使得原来序列成为基本有序。...为什么插入排序比冒泡排序更受欢迎 冒泡排序和插入排序的时间复杂度都是O(n^2),都是稳定的原地排序算法,为什么插入排序就这么受欢迎呢? 前两篇文章有提到有序度,逆序度。

1.2K20

为什么插入排序比冒泡排序更受欢迎?

插入排序和冒泡排序的时间复杂度 插入排序和冒泡排序的时间复杂度相同,都是 O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢? 2....这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 比如我们有一组数据 2,9,3,4,8,3,按照大小排序之后就是 2,3,3,4,8,9。...初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。...重复这个过程,直到未排序区间中元素为空,算法结束。如图所示,要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。 ?...插入排序的时间复杂度最好就是有序的所以是O(n),而最坏就是反序的就是O(n2)。 4.为什么插入排序比冒泡排序更受欢迎?

83671

一文带你读懂排序算法(二):希尔排序算法

* 希尔排序算法 * 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接插入排序不同的是,他会优先比较距离较近的元素。...可能会有疑问,为什么不是按照图示的[32,26,60]来逐个比较呢?因为代码不需要像图示那样,额外花销来维护第几趟。...2)希尔排序首先要解决的问题是使得数组内部的序列大部分是有序的,怎么样实现这个想法呢? 答:方法是将数组按照不同的间隔分成若干个序列,在序列内进行直接插入排序,最后进行一趟直接插入排序。...因为在划分的序列中都是有序的,等到最后一次增量为1的时候那么菜进行直接插入排序这个时候排序就比直接插入排序更慢了。...(由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的) —END

33310

重学数据结构和算法(四)之冒泡排序、插入排序、选择排序

这个概念是说,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 我通过一个例子来解释一下。...初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。...重复这个过程,直到未排序区间中元素为空,算法结束。 要排序的数据是 4,5,6,1,3,2,其中左侧为已排序区间,右侧是未排序区间。...,都是 O(n2),在实际的软件开发里,为什么我们更倾向于使用插入排序算法而不是冒泡排序算法呢?...比如 5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以就不稳定了。

72930

Java数据结构和算法(九)——高级排序

①、直接插入排序   直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。 ?   ...array[j-1];//向后挪动 j--; } array[j] = tmp;//存在比其小的数,插入 } return array; } }   我们可以分析一下这个直接插入排序...②、希尔排序图解   希尔排序应运而生了,希尔排序通过加大插入排序元素的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能够大跨度的移动。...下图显示了增量为4时对包含10个数组元素进行排序的第一个步骤,首先对下标为 0,4,8 的元素进行排序,完成排序之后,算法右移一步,对 1,5,9 号元素进行排序,依次类推,直到所有的元素完成一趟排序,...但是一般我们选取数组中第一个元素为基准元素(假设数组是随机分布的) ③、快速排序图示 ?   上面表示的是一个无序数组,选取第一个元素 6 作为基准元素。左游标是 i 哨兵,右游标是 j 哨兵。

91560

【排序算法】一文教你从零学会希尔排序

我以下面这个例子来更加形象地解释一下上面的代码。假设要将5,4,3,2,1这个数组调整为升序,n为5,数组的下标分别为0,1,2,3,4。 for循环的第一趟循环,为的就是让数组的前两个数有序。...第一趟i=0,endi=i=0,tmp=a[1]=4(tmp的作用就是保存要插入前面序列的那个数的值),a[endi](第一个数)比tmp(第二个数的值)大,将 a[endi]的值赋给a[endi +...endi不断减减,比tmp大的数就不断往后挪一格,最后endi+1这个位置就是tmp这个值应该去的位置。...有人可能就会问了,为什么要取一定距离来分组呢?...最后当gap == 1时,就是直接插入排序。在这里要说明一下,为什么for循环中的限定语句要写成i < n - gap?

11110

基础算法| 常用排序算法小结

想小编当年入门的时候,就是仰仗着冒泡大法,从此踏入红尘,一去不返……呃这个扯远了,为什么叫冒泡呢?这个后面再解释。...可以看出,关于相等元素,排序前后并不会改变他们的位置。因此,插入排序又是稳定的。 4 希尔排序(Shell Sort) 希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本。...6 快速排序(Quick Sort) 1 1 终于说到这个大boss了。为什么叫快速排序呢?额,这个倒不是因为它很快。 快速排序由C. A. R. Hoare在1962年提出。...还是以数组A[N]为例,为大家慢慢道来: 1)设置两个变量i、j,排序开始的时候:i=0,j=N; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前搜索,即由后开始向前搜索...(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换; 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换; 5)重复第3、4

69850

一文搞定插入排序算法

三、插入排序 1、插入排序原理 每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。...插入排序,顾名思义其基本操作就是插入,不断把一个个元素插入到一个序列中,最终得到排序序列。 ? ? 插入排序就像打牌一样,当你摸到比较小的牌时,通常往后放,遇到比较大的牌时,通常往前方。...步骤: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果被扫描的元素(已排序)大于新元素,将该元素后移一位 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置...class InsertionSort { public static int[] INSERTION_SORT(int[] ints){ //所有参与排序的数组的索引范围,为什么从...;对于一个N,不管这个N是如何增长,这个时间是不变的。

53020

算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

插入排序中的插入是指“取出无序数列中第一个值,插入到有序数列中相应的位置”。其实这个插入过程也是不断比较和交换的过程。...每一轮插入都会取出无序数列中的第一个元素插入到有序数列中,这个插入的过程其实就是一个比较交换的过程,如果要插入的值比前面的值要小,就要交换,直到不能交换为止。下方就是插入排序的过程。...我们将为一组的元素使用直线进行相连,分完组后,我们就将组内中的元素进行插入排序。 (2)、将上一步使用的增量进行缩小,也就是本步骤的step = 5 / 2 = 2。...因为有序序列的最后一个值与无序序列的第一个值紧挨着,交换后,这个无序序列中的第一个值就成了有序序列的最后一个值。重复这个选择的过程,我们的数组就会变得有序。...下方是对下方步骤的详细介绍: 初识状态下,我们整个数组就是无序的,从整个数组中我们找到了最小的元素35,其下标为5。然后将35与无序序列第一个元素62进行交换。

72970

JDK源码——Arrays.sort()的实现

* 双插入排序,每次完成两个元素插入排序。...* 开始我还一直再纠结:for循环第三个条件为什么是k=++left,这样a1和a2岂不是一个元素了嘛?...,最后一个元素没有进行配对需要另外进行插入排序 int last = a[right]; while (last < a[--right]...首先还是进行数组长度的判断,如果小于一定阈值(默认是47),则进行插入排序,大家仔细看一下上边的代码,跟我们平常的插入排序有所不同,他每个轮次会完成两个元素的插入,官方称这种为pair insertion...采用两个轴进行快排,使得整个数组分为三个部分,左边部分的元素都小于第一个轴,中间的部分大于等于第一个轴小于等于第二个轴,右边部分都大于第二个轴。

1.9K20

Java集合与数据结构——七大排序算法的实现

1.原理 整个区间被分为 1.有序区间 2.无序区间   每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入 2.基本思想   直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中...实际中我们玩扑克牌时,就用了插入排序的思想 ? 我们来说一下 直接插入排序的具体步骤: ? 1.定义一个 变量 i ,i 从这个数组中的第二个元素开始遍历 ?...还有一种判断稳定性的方法:   在排序时,如果元素 没有发生跳跃式 变换,只是相邻元素交换的话,这个排序就是稳定的.   还有通过这个代码我们发现,这个排序也可以变成不稳定的, ?   ...然后再取一个比第一增量小的整数作为第二增量,重复上述操作… 2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。 为什么要让gap由大到小呢?  ...此时从第一个到 倒数第二个再次调整,调整完后将堆顶元素 与倒数第二个元素交换,按照这样的逻辑规律,循环直到 有序.

54430
领券