数据结构与算法(JAVA篇)之高级排序_希尔排序

/**
 *
 * @author SunnyMoon
 */
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
 * 概念介绍:
 * *****************************************************************************
 * 
 * 简单排序:
 * 包括冒泡排序,选择排序和插入排序,是一些容易实现的,但速度比较慢的排序算法。
 * 
 * 高级排序:
 * 归并排序,希尔排序和快速排序比简单排序快很多。本节主要介绍希尔排序。
 * 
 * 归并排序:
 * 在递归算法中已经介绍过,它需要的容易是原始空间的两倍,是一个严重的缺点。
 * 
 * 快速排序:
 * 不需要大量辅助空间,并且是通用排序算法中最快的一咱排序算法,是基于划分的思想。
 * 
 * 希尔排序:
 * 不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,
 * 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为 O(N*(logN)2),
 * 没有快速排序算法快 O(N*(logN)),因此中等大小规模表现良好,对规模非常大的数据排序不是
 * 最优选择。但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。
 * 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏
 * 的情况下执行的效率会非常差。
 * 
 * 专家门提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,
 * 再改成快速排序这样更高级的排序算法。
 * 
 * 本质上讲,希尔排序算法的一种改进,减少了其复制的次数,速度要快很多。
 * 原因是,当N值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。
 * 当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。
 * 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
 */
////////////////////////////////////////////////////////////////////////////////

class Array {

    private long[] theArray;
    private int nElems;

    public Array(int max) {
        theArray = new long[max];
        nElems = 0;
    }

    public void insert(long value) {
        theArray[nElems] = value;
        nElems++;
    }

    public void display() {
        System.out.print("A=");
        for (int j = 0; j < nElems; j++) {
            System.out.print(theArray[j] + " ");
        }
        System.out.println("");
    }

    public void shellSort() {
        int inner, outer;
        long temp;

        int h = 1;
        while (h <= nElems / 3) {
            h = 3 * h + 1;
        }

        while (h > 0) {
            for (outer = h; outer < nElems; outer++) {
                temp = theArray[outer];
                inner = outer;

                while (inner > h - 1 && theArray[inner - h] >= temp) {
                    theArray[inner] = theArray[inner - h];
                    inner = inner - h;
                }
                theArray[inner] = temp;
            }
            h = (h - 1) / 3;
        }
    }
}
class ShellSortApp {

    public static void main(String[] args) {
        int maxSize = 30;
        Array arr = new Array(maxSize);

        for (int j = 0; j < maxSize; j++) {
            long n = (int) (java.lang.Math.random() * 99);
            arr.insert(n);
        }
        arr.display();
        arr.shellSort();
        arr.display();
    }
}
////////////////////////////////////////////////////////////////////////////////
/**
 * 运行结果:
 * A=29 14 28 16 40 64 29 11 58 27 88 96 41 63 19 30 55 82 6 10 83 93 86 13 29 19 20 83 83 8 
 * A=6 8 10 11 13 14 16 19 19 20 27 28 29 29 29 30 40 41 55 58 63 64 82 83 83 83 86 88 93 96 
 */

/**
 * 总结:
 * 希尔排序是对插入排序的一种强有力的改进,极大的提升了其效率,特别是当排序的
 * 数据项增加的时候。
 * 例子为随机生成30个数,然后将其用希尔算法排序再输出。
 */
//////////////////////////////////////////////////////////////////////////////////

 

BERT + BiLSTM-CRF 处理流程 BERT是一个基于 Transformer 的预训练语言模型。传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。 阅读详情

相关推荐

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 129

数据结构算法希尔排序

希尔排序概念 代码实现 时间复杂度

努力让自己发光,对的人才能迎着光而来 2万+

rinex.rar_RINEX_crx2rnx.exe_rinex格式

用于解压rinex文件 将其转化标准rinex格式

JavaSE数据结构排序算法之冒泡排序,选择排序,插入排序希尔排序

文章带大家认识排序算法——冒泡排序,选择排序,插入排序希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java

未见花闻的博客 1493

希尔排序算法

本章介绍排序算法中的希尔排序。内容包括: 1. 希尔排序介绍 2. 希尔排序图文说明 3. 希尔排序的时间复杂度和稳定性 4. 希尔排序实现 4.1 希尔排序C实现 4.2 希尔排序C++实现 4.3 希尔排序Java实现转载请注明出处:希尔排序 - 如果天空不死 - 博客园更多内容:数据结构算法系列 目录希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于

生活需要深度 3197

JAVA数据结构算法之————希尔排序

JAVA数据结构算法之————希尔排序 个人理解:希尔排序其实是增量不为1的冒泡排序。 代码: import java.util.Arrays; /* * 希尔排序算法的时间复杂度为O(n^1.5), 空间复杂度为O(1) * */ public class ShellSort<E extends Comparable> { private Swap<E> s ...

qq_36007633的博客 588

JAVA排序算法希尔排序

基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序希尔排序法基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止 希尔排序法的示意图 代码实...

imust的博客 1724

java希尔排序(含希尔排序代码)

希尔排序原理 希尔排序为啥比插入排序效率高 希尔排序的代码详解

qq_56127002的博客 5172

Java数据结构算法希尔排序

希尔排序介绍及其实现

lolly1023的博客 714

408 数据结构|红黑树插入:只记两大类

父红叔红和父红叔黑。

2301_82049134的博客 22

归并排序:从排序到逆序对统计

关于归并排序及其在四道leetcode题目中的应用。 需要提取核心要点。归并排序的增值点在于合并有序区间时可同步统计信息。文章覆盖四道题:普通排序、逆序对、右侧更小元素、翻转对。前三题递进,最后一题展示了在归并前用双指针统计特殊关系。还需提到核心思想是分治、合并时统计、有序性带来的一次性统计优势。 用户指明“根据以下内容”,所以摘要必须源自文本,不能添加外部信息。

2302_80962717的博客 589

数据结构-复习

内存泄漏:动态申请的堆内存 (malloc /calloc/new),使用完没有释放,并且丢失了这块内存的地址,程序再也无法回收这块内存。内存来自堆 heap,不是栈(栈自动释放,不存在泄漏)后果:内存越吃越多,长期运行程序卡顿、崩溃、被系统杀死,所以使用完成之后必须手动free()排查工具:valgrindvalgrind --leak-check=full ./可执行程序definitely lost:确定泄漏(必须修复)indirectly lost:间接泄漏,子节点没释放。

2401_82879595的博客 56

Redis使用及数据结构

Reids是基于内存的非关系性数据,而mysql的数据存在磁盘上,所以redis性能普遍高于mysql。但读写性能还受硬件、配置、数据大小、持久化策略、事务、是否集群、是否锁冲突等影响。普遍的认为单机redis一般支持10万级并发读写,mysql只到万级。对于同一热点数据(同一个key或同一行数据),redis单线程排队而mysql需要加锁阻塞,redis依旧支持万级QPS而mysql只支持几百。

xbgRS的博客 241

数据结构——绪论

算法评估和时间复杂度计算。摘要需简洁概括。注意字数限制。</think>本文介绍了数据结构的基本概念,包括数据元素、逻辑存储结构,并讲解了算法评估标准,重点阐述时间复杂度的分类计算方法,通过单层、嵌套及多层循环例题演示求解步骤,为后续学习奠定基础。

2301_80687320的博客 210

数据结构——队列的概念解析核心代码

<think>我们只需要根据用户提供的长文生成一个≤150字的文章摘要。要求概括核心内容,包括队列的定义、特点、关键实现、复杂度、常见陷阱等。注意字数限制。综合提炼即可。</think>队列是先进先出的受限线性表,用带头尾双指针和size的链式结构实现,入队尾插、出队头删均O(1)。用size维护长度使判空求长O(1),且需注意只剩一个节点出队时置空尾指针、销毁时先存next再free等经典陷阱。整体适合链表实现,优于数组开头的队列。

DDXYcoder的博客 203

数据结构:二叉树的实现

<think>我们要求根据给定内容生成≤150字的文章摘要。内容是关于二叉树的介绍,包括定义、术语、性质、存储、创建、遍历、统计等。摘要需要概括核心要点。需控制字数在150字以内。注意是“文章摘要”,应简洁概括主要内容。输出直接是摘要文本,不需要额外说明。我们来组织:二叉树是每个节点最多两个子节点的树,有左右之分。常用链式存储,节点含数据及左右指针。创建可用先序+空标记递归。遍历有前序、中序、后序(递归)和层序(队列)。关键操作:求叶子数、节点数、高度、每层节点数,销毁需后序。要点:递归出口、根

Edbse的博客 359

排序-堆排序(Heap Sort)

摘要:堆排序是一种基于二叉堆数据结构的原地排序算法,凭借稳定的 O(nlog n) 时间复杂度和 O(1) 的额外空间开销,弥补了冒泡、选择、插入排序在大规模数据下效率低下的短板。本文从堆的底层性质出发,完整讲解堆排序的原理、向上调整、向下调整、建堆逻辑排序流程,重点剖析「升序建大根堆、降序建小根堆」这一核心口诀的根本原因,并给出可运行的 C++ 代码实现,帮助读者彻底吃透堆排序

2401_87882972的博客 104

4.3 二叉树

如果从非递归的角度理解,遍历实际上是从树根结点开始,沿其左孩子域向下移动,直到某·结点再无左孩子为止,访问这个最左边的结点,接下来再从此结点的右孩子结点开始进行中序遍历,当右子树遍历完了以后,退回到上一层的未访问结点继续二叉树的遍历,直到树中所有的。树的遍历是指访问树的每个结点,且每个结点仅被访问一次。一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点满二叉树中编号为i的结点在二又树中的位置相同,则这棵二叉树称为完全二叉树。

2601_96748017的博客 180

数据结构 - 线性表 - 双向链表

先断言确保链表不为空,拿到尾结点地址保存到 del,将尾结点的前一个结点的 next 指向哨兵头,再更新哨兵头的 prev 指向新的尾部结点,释放被删除结点的内存并置空局部指针,完成尾部结点的删除。先断言检查头指针不为空,调用函数生成新结点,把新结点的前驱指向原来的尾结点、后继指向哨兵头结点,再修改原尾结点的后继和头结点的前驱,完成新结点接到链表尾部的双向链接。(1)单向链表只能从头结点遍历到尾结点,双向链表能从头走向为尾也能从。保存的数据 + 指向下一个节点的指针 + 指向前一个结点的指针。

2601_95032979的博客 232

C语言冒泡算法(Bubble sort)

C语言冒泡算法详解

2401_84956662的博客 37
上一篇: 数据结构与算法(JAVA篇)之递归算法(四)
下一篇: 数据结构与算法(JAVA篇)之高级排序_快速排序(一)
sunnymoon
博客等级 码龄21年 1粉丝 8原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值