首页 > 其他分享 >希尔排序

希尔排序

时间:2022-08-30 16:48:26浏览次数:36  
标签:插入排序 希尔 数组 增量 排序 复杂度

先介绍下概念: 这些网上有,理解了就基本完成一半了


希尔排序是基于插入排序的以下两点性质而提出改进方法的:
    插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
    但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。



希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。



简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。

  我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列

 

 

 

 

 

 

 

标签:插入排序,希尔,数组,增量,排序,复杂度
From: https://www.cnblogs.com/wangbiaohistory/p/16639904.html

相关文章

  • 83. 删除排序链表中的重复元素
    83.删除排序链表中的重复元素#由于是已排序的链表,判断前后是否为相同元素如果是则连接下下个不是则向前移动#code:#Definitionforsingly-linkedlist.#classLis......
  • 拓扑排序(topsort)
    给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出−1。若一个由图中所有点构成......
  • 快速排序
    快速排序快速排序是一种分治的递归算法,平均时间复杂度:O(NlogN)。1.1基础版//递归方法intparition(vector<int>&arry,intleft,intright){intpivotkey;//......
  • 冒泡排序
    1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,交换其位置。2.每一次比较,都会产生一个最大或最小的数字;3.下一轮比上一轮少比较一次importjava.util.Arrays;pub......
  • 【leetcode】81. 搜索旋转排序数组 II
    原题地址:https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/用循环遍历数组肯定能轻松找到target但要尽可能减少操作步骤,一般跟顺序有关的都是用二分,关键......
  • 使用 QuickSort 算法解决排序数组
    使用QuickSort算法解决排序数组这里我们将讨论一个案例,如何将一系列数字以随机排列的数组的形式排序,使其成为从最小到最大的数字序列。我们将使用最后一个元素的方法......
  • 在排序数组中查找元素的第一个和最后一个位置
    目录题目描述解题思路解题代码题目描述题目地址:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/题目要求给你一个按照非递......
  • 搜索旋转排序数组
    目录题目描述解题思路解题代码题目描述题目地址:https://leetcode.cn/problems/search-in-rotated-sorted-array/题目要求整数数组nums按升序排列,数组中的值互不相同......
  • jpaDSL分页,排序
    //排序JPAQuery<Customer>orderBy=customer.orderBy(QCustomer.qcustomer.createTime.desc());//分页JPAQuery<Customer>limit=orderBy......
  • LeetCode刷题23-在排序数组中查找元素的第一个和最后一个位置
    importjava.util.Arrays;/***功能描述**@authorASUS*@version1.0*@Date2022/8/27*/publicclassMain06{publicstaticvoidmain(String[]......