/**
*
* @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个数,然后将其用希尔算法排序再输出。
*/
//////////////////////////////////////////////////////////////////////////////////
相关推荐
手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控
本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。
数据结构与算法之希尔排序
希尔排序概念 代码实现 时间复杂度
rinex.rar_RINEX_crx2rnx.exe_rinex格式
用于解压rinex文件 将其转化标准rinex格式
【JavaSE与数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序
本篇文章带大家认识排序算法——冒泡排序,选择排序,插入排序与希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法,希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java。
希尔排序算法
本章介绍排序算法中的希尔排序。内容包括: 1. 希尔排序介绍 2. 希尔排序图文说明 3. 希尔排序的时间复杂度和稳定性 4. 希尔排序实现 4.1 希尔排序C实现 4.2 希尔排序C++实现 4.3 希尔排序Java实现转载请注明出处:希尔排序 - 如果天空不死 - 博客园更多内容:数据结构与算法系列 目录希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于
JAVA数据结构与算法之————希尔排序
JAVA数据结构与算法之————希尔排序 个人理解:希尔排序其实是增量不为1的冒泡排序。 代码: import java.util.Arrays; /* * 希尔排序算法的时间复杂度为O(n^1.5), 空间复杂度为O(1) * */ public class ShellSort<E extends Comparable> { private Swap<E> s ...
JAVA排序算法之希尔排序
基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 希尔排序法基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止 希尔排序法的示意图 代码实...
java希尔排序(含希尔排序代码)
希尔排序原理 希尔排序为啥比插入排序效率高 希尔排序的代码详解
【Java数据结构与算法】希尔排序
希尔排序介绍及其实现
408 数据结构|红黑树插入:只记两大类
父红叔红和父红叔黑。
归并排序:从排序到逆序对统计
关于归并排序及其在四道leetcode题目中的应用。 需要提取核心要点。归并排序的增值点在于合并有序区间时可同步统计信息。文章覆盖四道题:普通排序、逆序对、右侧更小元素、翻转对。前三题递进,最后一题展示了在归并前用双指针统计特殊关系。还需提到核心思想是分治、合并时统计、有序性带来的一次性统计优势。 用户指明“根据以下内容”,所以摘要必须源自文本,不能添加外部信息。
数据结构-复习
内存泄漏:动态申请的堆内存 (malloc /calloc/new),使用完没有释放,并且丢失了这块内存的地址,程序再也无法回收这块内存。内存来自堆 heap,不是栈(栈自动释放,不存在泄漏)后果:内存越吃越多,长期运行程序卡顿、崩溃、被系统杀死,所以使用完成之后必须手动free()排查工具:valgrindvalgrind --leak-check=full ./可执行程序definitely lost:确定泄漏(必须修复)indirectly lost:间接泄漏,子节点没释放。
Redis使用及数据结构
Reids是基于内存的非关系性数据,而mysql的数据存在磁盘上,所以redis性能普遍高于mysql。但读写性能还受硬件、配置、数据大小、持久化策略、事务、是否集群、是否锁冲突等影响。普遍的认为单机redis一般支持10万级并发读写,mysql只到万级。对于同一热点数据(同一个key或同一行数据),redis单线程排队而mysql需要加锁阻塞,redis依旧支持万级QPS而mysql只支持几百。
数据结构——绪论
算法评估和时间复杂度计算。摘要需简洁概括。注意字数限制。</think>本文介绍了数据结构的基本概念,包括数据元素、逻辑与存储结构,并讲解了算法评估标准,重点阐述时间复杂度的分类与计算方法,通过单层、嵌套及多层循环例题演示求解步骤,为后续学习奠定基础。
数据结构——队列的概念解析与核心代码
<think>我们只需要根据用户提供的长文生成一个≤150字的文章摘要。要求概括核心内容,包括队列的定义、特点、关键实现、复杂度、常见陷阱等。注意字数限制。综合提炼即可。</think>队列是先进先出的受限线性表,用带头尾双指针和size的链式结构实现,入队尾插、出队头删均O(1)。用size维护长度使判空求长O(1),且需注意只剩一个节点出队时置空尾指针、销毁时先存next再free等经典陷阱。整体适合链表实现,优于数组开头的队列。
数据结构:二叉树的实现
<think>我们要求根据给定内容生成≤150字的文章摘要。内容是关于二叉树的介绍,包括定义、术语、性质、存储、创建、遍历、统计等。摘要需要概括核心要点。需控制字数在150字以内。注意是“文章摘要”,应简洁概括主要内容。输出直接是摘要文本,不需要额外说明。我们来组织:二叉树是每个节点最多两个子节点的树,有左右之分。常用链式存储,节点含数据及左右指针。创建可用先序+空标记递归。遍历有前序、中序、后序(递归)和层序(队列)。关键操作:求叶子数、节点数、高度、每层节点数,销毁需后序。要点:递归出口、根
排序-堆排序(Heap Sort)
摘要:堆排序是一种基于二叉堆数据结构的原地排序算法,凭借稳定的 O(nlog n) 时间复杂度和 O(1) 的额外空间开销,弥补了冒泡、选择、插入排序在大规模数据下效率低下的短板。本文从堆的底层性质出发,完整讲解堆排序的原理、向上调整、向下调整、建堆逻辑与排序流程,重点剖析「升序建大根堆、降序建小根堆」这一核心口诀的根本原因,并给出可运行的 C++ 代码实现,帮助读者彻底吃透堆排序。
4.3 二叉树
如果从非递归的角度理解,遍历实际上是从树根结点开始,沿其左孩子域向下移动,直到某·结点再无左孩子为止,访问这个最左边的结点,接下来再从此结点的右孩子结点开始进行中序遍历,当右子树遍历完了以后,退回到上一层的未访问结点继续二叉树的遍历,直到树中所有的。树的遍历是指访问树的每个结点,且每个结点仅被访问一次。一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二又树中的位置相同,则这棵二叉树称为完全二叉树。
数据结构 - 线性表 - 双向链表
先断言确保链表不为空,拿到尾结点地址保存到 del,将尾结点的前一个结点的 next 指向哨兵头,再更新哨兵头的 prev 指向新的尾部结点,释放被删除结点的内存并置空局部指针,完成尾部结点的删除。先断言检查头指针不为空,调用函数生成新结点,把新结点的前驱指向原来的尾结点、后继指向哨兵头结点,再修改原尾结点的后继和头结点的前驱,完成新结点接到链表尾部的双向链接。(1)单向链表只能从头结点遍历到尾结点,双向链表能从头走向为尾也能从。保存的数据 + 指向下一个节点的指针 + 指向前一个结点的指针。
C语言冒泡算法(Bubble sort)
C语言冒泡算法详解
129


之高级排序_希尔排序&spm=1001.2101.3001.11974&articleId=83322103&d=1&t=3&u=dea4b933233643a7b752224e4d5dcfcb)

被折叠的 条评论
为什么被折叠?



