插入(希尔)排序时间、空间复杂度
时间avg | 时间min | 时间max | 空间avg | 稳定性 |
插入:O(n²) 希尔:O(n√n)(O(n^(1.3—2)))(与序列有关) |
希尔:O(n^(1.3)) 插入:o(n)序列已经是期望顺序了,在这种情况下,需要进行的比较操作需(n-1)次即可 |
希尔:O(n²) 插入:O(n²)序列是期望顺序的相反序列,那么此时需要进行的比较共有n(n-1)/2次 |
希尔、插入排序 使用的空间是O(1) |
稳定性: 希尔:不稳定 插入:稳定 |
插入排序:
算法优点:稳定,快。
算法缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多(特别是当数据总量庞大的时候)。但用链表可以解决这个问题。
适用:当元素数量小,分布有序,要求稳定直接插入排序将大大减少比较次数和移动记录的次数
希尔排序
优缺:
时间复杂度取决于所用序列:
不稳定;取决于增量序列选择的好坏
插入排序改进措施
- 优化为希尔排序:希尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为1,完成排序,因此又叫“缩小增量排序法”。
其实到希尔算法进行到最后,n的值变为1(即增量或者称跳跃数变为1)的时候,它就是直接插入排序,只不过这时候,整个序列基本上是有序的,需要交换的数据已经非常少了,提高效率。
package main.Test;import java.util.Arrays;public class XiErSort {// 非递归private static void sort(int arr[]) {for(int d = arr.length/2; d >= 1; d/=2) {for(int i = d; i < arr.length; i++) {int j = i;while (j - d >= 0 && arr[j - d] > arr[j]) {swap(arr, j, j - d);j -= d;}}}}// 递归private static void sort(int arr[], int d) {for(int i = d; i < arr.length; i++) {int j = i;while (j - d >= 0 && arr[j - d] > arr[j]) {swap(arr, j, j - d);j -= d;}}if (d/2 >= 1)sort(arr, d/2);}private static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void main(String[] args) {int[] a = new int[]{1, 2, 4, 5, 3, 1, 2, 3};sort(a, a.length);System.out.println(Arrays.toString(a));}
}
插入(希尔)排序时间、空间复杂度相关推荐
- 算法研究:插入类排序(简单插入,折半插入,希尔排序)
百度百科:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经 ...
- 排序算法分析:冒泡排序、选择排序、插入排序、希尔排序、快速排序
文章目录 一.冒泡排序 二.选择排序 三.插入排序 四.希尔排序 五.快速排序 一.冒泡排序 冒泡排序(Bubble Sort),它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大 ...
- 排序算法---希尔排序(java版)
希尔排序 原理 先将待排序表分割成若干相隔某个"增量"的记录组成一个子表,对各个子表分别进行直接插入,当整个表中的元素已成基本有序是,再对全体记录进行一次直接插入排序.希尔排序主要 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- 排序算法之希尔排序(缩小增量排序)
前面两篇介绍了两个非常简单又非常基础的算法--选择排序和插入排序,并通过一篇关于大乐透的小应用程序介绍了插入排序的一个简单应用.本篇介绍一个基于插入排序算法的.快速的排序算法--希尔排序.同样,本篇主 ...
- 图文并茂 —— 插入排序,希尔排序
图文并茂 -- 插入排序,希尔排序 每博一文案 杨绛先生曾说:世态人情,可做书读,可当细看.行走在人生的旅途中, 遇见的人数不胜数,结识的朋友也越来越多,走过半身,尝遍人情冷暖, 后领悟到一句话的真谛 ...
- 【大话数据结构算法】希尔排序
希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序. 直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序 ...
- python排序算法——希尔排序(附代码)
python排序算法--希尔排序 文章目录 python排序算法--希尔排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法 ...
- 【python算法系列三】 希尔排序算法
希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...
最新文章
- 详解目标检测之Neck选择
- torch.roll
- AI洞观 | 戴上红帽 看IBM冲杀云计算市场
- Python之web开发(六):python使用django框架搭建网站之图表显示操作
- 我有做短视频的freestyle,要来一起吗?
- Mac解决终端显示乱码
- Redis单机配置多实例,实现主从同步
- 如何在虚拟linux环境运行python_Conda(Python)虚拟环境不能从Windows移植到Linux
- activiti idea 请假流程_IDEA创建Activiti工作流开发
- php java openssl ras_php基于openssl的rsa加密解密示例
- hoj 1640 Mobile phones //poj 1195 Mobile phones 二维树状数组
- Patchwork Quilting(拼布和绗缝)
- vivado global和out-of-context 选项
- 怎么获取当前页面的URL
- Flink+Hudi 构架湖仓一体化解决方案
- Kepware IOT Gateway Rest server
- Windows绘图基础
- DisplayTag的使用方法
- 关于CodeBlocks下载后无法编译运行的问题
- Air720H模块MQTT协议的AT指令流程