首页
学习
活动
专区
圈层
工具
发布

插入排序和希尔排序(Java)

插入排序思想:开始时指针指向第二个元素,从指针位置往前进行元素比较,大的元素往后挪一位,直到找到比指针位置元素小的位置,将该位置赋值成指针指向的值,指针往后移一位,此时前面的元素都已经排好序了,往复元素比较操作...:观察插入排序发现如果数组已经有一定的排列了,那么插入排序性能会很高,例:0 2 3 4 1 排序,前面都是一次判断,不需要交换操作,只有最后一次循环将 2 3 4 往后挪一位,将 1 插入 0 后面。...希尔排序加入了步长,而不是一开始就从头进行插入排序,目的是将数组进行一定的排序,最后再用插入排序进行排序,性能比直接使用插入排序快 shellSort.png 实现代码: /** *...//小的位置赋值成插入值 nums[j] = target; } } } 为了对比直接插入排序和希尔排序的区别...:" + count[0]); 结果: 0 1 1 3 4 5 6 7 8 9 插入排序交换次数:21 0 1 1 3 4 5 6 7 8 9 以步长4先进行希尔排序后排序的交换次数:15

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

    冒泡排序,选择排序,插入排序,折半插入排序

    ),就是省去了交换过程,变成了下标的更新,最后再完成一次交换 3.直接插入排序 直接插入排序就是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表 //直接插入排序----升序...以便在找到合适位置的时候能够直接插入 arr[j + 1] = arr[j]; } //最后将temp插入到合适的位置 arr[j + 1] = temp; } } } 降序版本 //直接插入排序...= i - 1;temp>arr[j]&&j>=0; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = temp; } } } 折半插入排序...将比较找到合适位置的过程用二分查找替代,在需要对海量数据进行排序的时候,提高了效率 升序: //折半插入排序----升序 void InsertSort(int arr[], int len) {...arr[j + 1] = arr[j]; } arr[j + 1] =temp; } } 降序: #include using namespace std; //折半插入排序

    66340

    ——排序——插入排序

    1 .插入排序 1.基本思想: 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列...稳定性:稳定 在实际应用中,如果待排序的数组已经基本有序,那么插入排序的效率会比较高。但是对于逆序数组或者随机排序的数组,插入排序的效率会比较低。...因此,插入排序通常用于对小规模数据或者部分有序数据的排序。 3.希尔排序( 缩小增量排序 ) 希尔排序法又称缩小增量法。...预排序是指在排序过程中,每次对分组进行插入排序之前,先对整个序列进行一次插入排序。这样做的目的是减少插入排序的比较和交换次数,从而提高排序效率。...预排序的实现方法是在每次缩小增量时,将待排序序列进行一次插入排序。

    36810

    排序----插入排序

    插入排序平均时间复杂度:O(N^2)。 插入排序的特点: 与选择排序一样,当前索引左边的所有元素都是有序的。但插入排序中它们的最终位置还未确定。 插入排序所需要的时间取决与输入中元素的初始顺序。...插入排序不会访问索引右侧的元素,而选择排序不会访问数组左侧的元素。...” } 算法改进: 插入排序的哨兵。...在插入排序的实现中先找到最小元素将其置于数组的最左边,这样就能去掉内循环中的判断条件j > 0;注意,这是一种常见的规避边界测试的方法,能够省略判断条件的元素通常被称为哨兵。 不需要交换的插入排序。...在插入排序中使较大元素右移一位而不是每次都交换。 在所有主键都相同时,插入排序比选择排序更快;对于逆序数组,选择排序比插入排序更快。 下一篇:希尔排序

    82100

    冒泡排序-选择排序-插入排序-快速排序(java版实现)

    排序就是将输入的数字按照从小到大的顺序进行排列。由于排序是一个比较基础的问题,所以排序算法的种类也比较多。最近学习了几种常见的排序算法,下面介绍如何使用java代码实现对数组进行从下到大排序。...arr[i] = arr[min]; arr[min] = temp; } } } } 三、插入排序...1、概念 插入排序默认左边是有序的,将待排序列第一个插入到左边对应的位置,保证每次插入左边序列都是有序的,插入数据时从右向左遍历左边有序数组,大于待插入数据,交换位置,只到小于待插入的数据停止比较,此时左边有序数组多了一位...子问题,也就是子序列完成排序后,再像一开始说明的那样,把他们合并成一个序列,那么对原始序列的排序也就完成了。不过,解决子问题的时候会再次使用快速排序,甚至在这个快速排序里仍然要使用快速排序。...java实现

    61420

    排序算法之插入排序(直接插入排序、折半插入排序、希尔排序)

    插入排序 在排序过程中,根据数据元素是否完全在内存中,可以将排序分成两类: 内部排序:是指在排序期间元素全部存放在内存中的排序。内部排序在执行过程中都要进行两种操作:比较和移动。...插入排序的思想是每次将一个待排序的记录按其关键字大小插入前面已排好序的子序列,直到全部记录插入完成。...插入排序思想可以引申为三种重要的排序算法:直接插入排序、折半插入排序、希尔排序 直接插入排序 理论 直接插入是一个稳定的排序方法,适用于顺序存储和链式存储的线性表。...折半插入排序将比较和移动操作分离,即先折半查找出元素的待插入位置,然后统一地移动待插入位置之后的所有元素。...,再对整个表进行一次直接插入排序。

    86940

    排序——插入排序

    插入排序 基本思想 每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。...即边插入边排序,保证子序列中随时都是排好序的 基本步骤: 在R1..i-1中查找Ri的插入位置; R1..j.key 插入排序(基于顺序查找...)排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。...[在这里插入图片描述] - 移动次数:[在这里插入图片描述] 平均时间复杂度:O(n^2) 空间复杂度 —— O(1) 需要一个记录的辅助空间r(0) 稳定性 稳定 特点:简单、容易实现,适用于待排序记录基本有序或待排序记录较小时...--- 折半插入排序(基于折半查找) 基本思想:因为 R1..i-1 是一个按关键字有序的有序序列,则可以利用折半查找实现“在R1..i-1中查找Ri的插入位置”,如此实现的插入排序为折半插入排序。

    54495

    7.2.2 插入排序之折半插入排序

    从直接插入排序的过程中,都进行了两项工作: ①从前面的子表中查找出待插入元素应该被插入的位置; ②给插入位置腾出空间,将待插入元素复制到表中的插入位置。...当排序表为顺序存储的线性表时,可以对直接插入排序做如下改造: 由于是顺序存储的线性表,所以查找有序子表时可以用折半查找来实现。 在确定出待插入位置后,就可以统一地后移元素了。...//统一后移元素,空出插入位置 } A[high+1]=A[0];//插入操作 } } 折半插入排序仅仅减少了比较元素的次数...,约为O(nlog2 N),该比较次数与待排序表的初始状态无关,仅取决于表中的元素的个数n; 而元素的移动次数没有改变,它依赖于待排序表的初始状态,因此折半插入排序的时间复杂度仍为O(n^2)。...折半插入排序是一个稳定的排序方法。

    1.4K10

    插入排序解读(基于java实现)

    插入排序思路插入排序是一种简单的排序算法,其工作原理如下:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤...3,直到找到已排序的元素小于或者等于新元素的位置将新元素插入到该位置后,继续重复步骤2~4时间空间复杂度分析插入排序的过程分为n-1趟排序,每趟排序需要进行n-i次比较和移动。...平均情况下,插入排序的时间复杂度为O(n^2)。空间复杂度方面,插入排序只需常数级别的额外空间存储临时变量,因此空间复杂度为O(1)。...key java...调用`insertionSort`方法对数组进行排序。使用`for`循环遍历排序后的数组,并打印每个元素。`insertionSort`方法:1.

    58710

    排序算法Java代码实现(三)—— 插入排序 和 希尔排序

    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有...(二)希尔排序 算法思想: 希尔排序的实质就是分组插入排序,又称缩小增量法; 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序, 然后依次缩减增量再进行排序,待整个序列中的元素基本有序时...,再对全体元素进行一次直接插入排序。...因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高 /** * */ package com.cherish.SortingAlgorithm; /**...,又称缩小增量法 * 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序, * 然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序

    71820

    插入排序

    55, 26] 排序前数组:[42, 41, 31, 7, 17, 2, 55, 26] 第0个元素是不需要进行排序的,所以是从第1个元素开始排序 准备排序组数中第1个元素:41 第1个元素排序过程:...,tmp变量存放在当前索引位置0 数组中第2个元素排序后:[31, 41, 42, 7, 17, 2, 55, 26] 准备排序组数中第3个元素:7 第3个元素排序过程:[31, 41, 42, 42,...3个元素排序后:[7, 31, 41, 42, 17, 2, 55, 26] 准备排序组数中第4个元素:17 第4个元素排序过程:[7, 31, 41, 42, 42, 2, 55, 26] 第4个元素排序过程...42, 2, 55, 26] 准备排序组数中第5个元素:2 第5个元素排序过程:[7, 17, 31, 41, 42, 42, 55, 26] 第5个元素排序过程:[7, 17, 31, 41, 41,...,不需要进行移位 数组中第6个元素排序后:[2, 7, 17, 31, 41, 42, 55, 26] 准备排序组数中第7个元素:26 第7个元素排序过程:[2, 7, 17, 31, 41, 42,

    41920

    插入排序

    随着刷题的数量的增多,慢慢感觉到很多题目之间的内在关联,每周遇到的比较新奇的题目还是坚持与各位分享一下~ ---- 本周我们分享一道排序题目,在之前的文章中,我们讲过一次归并排序(归并排序),这次我们讲一下插入排序...插入排序 LeetCode 147 --->对链表进行插入排序【中等题】 ? 题目描述 LeetCode上面,原题就是需要我们按照插入排序的算法来完成整个排序。...动态过程 一、解题思路 在这次的题目中,我们的难点不在于其排序思想,而是在于此算法的实现。从算法上面我们可以直观的感受到,每个元素只会被移动一次,我们会将链表的前半段形成一个排序的链表结构。...每次移动的元素会被插入在这个相对排序的列表中的正确位置。每次插入的元素,我们从链表的前半段的末尾进行获取。当我们获取到了最后一个元素的时候,我们就完成了整体的插入排序。...= null){ if(cur.val 排序链表之前,直接更新头结点即可 end.next = cur.next

    73410

    插入排序

    插入排序的基本概念 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。...插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。...插入排序的算法步骤 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。...还有一个做法是,将新元素取出,从左到右依次与已排序的元素比较,如果已排序的元素大于新元素,那么将该元素移动到下一个位置,接着再与前面的已排序的元素比较,直到找到已排序的元素小于等于新元素的位置,这时再将新元素插入进去...,就像下面这样: 插入排序的动图演示 java代码实现 public class InsertSort implements IArraySort { @Override public

    58910
    领券