- 浏览: 1230388 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
希尔排序法基本思想
希尔排序(Shell
Sort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某
个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插
入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
具体做法:首先确定一组增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),对于
i=0,1,2,...,t-1,依次进行下面的各趟处理:根据当前增量di将n个元素分成di个组,每组中元素的下标相隔为di;再对各组中元素进行直
接插入排序.
2、下面给出希尔排序算法的执行过程。
(1)采用希尔排序法排序的各趟的结果如下:
初始:503,17,512,908,170,897,275,653,426,154,509,612,677,765,703,94
第1趟{d1=8}:426,17,509,612,170,765,275,94,503,154,512,908,677,897,703,653
第2趟(d2=4):170,17,275,94,426,154,509,612,503,765,512,653,677,897,703,908
第3趟(d3=2):170,17,275,94,426,154,503,612,509,653,512,765,677,897,703,908
第4趟(d1=1):17,94,154,170,275,426,503,509,512,612,653,677,703,765,897,908
(2)例如,n=8,数组a的八个元素分别为:17,3,30,25,14,17,20,9。
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1
排序过程如【动画模拟演示】。
Shell排序的算法实现
1. 不设监视哨的算法描述
using System;
using System.Collections.Generic;
using System.Text;
namespace ExShellSorter
{
public class ShellSorter
{
public void Sort(int[] arr)
{
int inc;
for (inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ;
for (; inc > 0; inc /= 3)
{
for (int i = inc + 1; i <= arr.Length; i += inc)
{
int t = arr[i - 1];
int j = i;
while ((j > inc) && (arr[j - inc - 1] > t))
{
arr[j - 1] = arr[j - inc - 1];//交换数据
j -= inc;
}
arr[j - 1] = t;
}
}
}
static void Main(string[] args)
{
int[] array = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
ShellSorter s = new ShellSorter();
s.Sort(array);
foreach (int m in array)
Console.WriteLine("{0}", m);
}
}
}
注意:
当增量d=1时,ShellPass和InsertSort基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件"j>0",以防下标越界。
2.设监视哨的shell排序算法
具体算法【参考书目[12] 】
算法分析
1.增量序列的选择
Shell排序的执行时间依赖于增量序列。
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在nl.25到1.6n1.25之间。
2.Shell排序的时间性能优于直接插入排序
希尔排序的时间性能优于直接插入排序的原因:
①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。
3.稳定性
希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。
发表评论
-
排序算法与查找算法
2014-09-01 10:17 382八大排序算法: http://blog.csdn.net ... -
用递归与非递归实现斐波拉希数列
2013-05-15 00:46 1906如下: package com.test; publ ... -
利用LinkedList制作一个栈
2012-12-19 21:55 877import java.util.LinkedList; ... -
递归问题求解学习一
2009-04-22 14:12 721http://blog.csdn.net/lixiaoshan ... -
算术逻辑推理学习
2009-04-23 15:52 987数字推理考察的是对 ... -
由递归所想到的:如何将字符串或者数字转换成大写货币的问题
2009-04-24 11:54 1224这个问题同事在面试的时候遇到过,最近在看有关递归的问题时 h ... -
数据结构基础--排序: 各种排序算法全分析
2009-05-06 11:35 1455http://www.cnblogs.com/ziyiFly/ ... -
数据结构-算法: 分配排序(基数分配排序法)
2009-05-06 11:41 1082http://www.cnblogs.com/ziyiFly/ ... -
数据结构-算法: 分配排序(箱分配排序)
2009-05-06 11:43 919http://www.cnblogs.com/ziyiFly/ ... -
数据结构-排序: 两路归并排序算法
2009-05-06 11:44 1738数据结构-排序: 两路归 ... -
数据结构-排序: 插入排序(直接插入排序法)
2009-05-06 11:45 1201数据结构-排序: 插入排 ... -
数据结构-排序: 交换排序(快速排序法)
2009-05-06 11:46 1473数据结构-排序: 交换排序(快速排序法) 1、算法思想 ... -
数据结构-排序: 选择排序(堆选择排序法)
2009-05-06 11:47 913数据结构-排序: 选择排 ... -
数据结构-排序: 交换排序(冒泡排序法)
2009-05-06 11:47 1038数据结构-排序: 交换排序(冒泡排序法) 冒泡排序(Bu ... -
数据结构-排序: 选择排序(直接选择排序法)
2009-05-06 11:48 976数据结构-排序: 选择排序(直接选择排序法) 直接选择排 ... -
C#实现--单链表(链式)
2009-05-06 11:49 1392C#实现--单链表(链式) using Syste ... -
C#实现二叉树(三元素式)及二叉树遍历的四种方法
2009-05-06 11:50 1461C#实现二叉树(三元素式) ... -
JAVA排序类汇总
2009-05-06 11:54 1217package com.softeem.jbs.lesson4 ... -
谈谈防 SQL 注入式攻击策略
2009-05-07 09:30 1421谈谈防 SQL 注入式攻击 ... -
二进制数转换为八进制, 十六进制数的算法
2009-05-07 09:44 1306using System; using System.Col ...
相关推荐
- **定义**:希尔排序是一种基于插入排序的比较排序算法,通过引入“增量”来改善插入排序的性能。 - **时间复杂度**:平均时间复杂度介于O(n log n)和O(n^(3/2))之间,具体取决于增量序列的选择。 - **稳定性**...
根据提供的文件信息,我们可以深入探讨几种经典的排序算法:冒泡排序、直接插入排序、快速排序以及希尔排序。这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. ...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序:各种常见排序算法及其时间复杂度分析。 - 查找算法:顺序查找、二分查找、哈希查找等。 4. **图算法**: - 深度优先搜索(DFS)和广度...
在IT领域,排序算法是数据结构与算法中的基础部分,对于高效处理大量数据至关重要。本文主要探讨了排序算法中的几种经典方法,包括直接插入排序、折半插入排序以及希尔排序。 首先,排序定义是为了将一个数据序列...
- 定义:利用堆这种数据结构所设计的一种排序算法。 - 时间复杂度:O(n log n)。 - **归并排序** - 定义:把长度为n的输入序列分成两个长度为n/2的子序列,对这两个子序列分别采用归并排序,然后将两个排序好的子...
10. **希尔排序**:希尔排序是对插入排序的改进,通过设置间隔序列来减少元素的移动次数。其时间复杂度取决于间隔序列的选择,一般认为是O(n^(3/2))。 在Vue.js中实现这些排序算法,可以帮助开发者更好地理解算法...
本资源聚焦于Python语言实现的各种排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序以及堆排序。下面将详细解释这些排序算法的工作原理及其在Python中的实现。 1. **冒泡排序(Bubble ...
- **排序算法**:冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序、基数排序等。 - **查找算法**:顺序查找、折半查找、二叉树查找等。 **5.4 分治法** - 定义:将大问题分解为小问题,分别...
算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。...
冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序和堆排序是七大基础的计算机算法,它们各自有着不同的特点和适用场景。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要...
在IT领域,排序算法是数据结构与算法设计中的核心部分,尤其在C++编程中,理解和掌握各种排序算法对于优化程序性能至关重要。本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡...
### 希尔排序法(希尔插入排序,希尔交换排序) #### 一、希尔排序法简介 希尔排序法是计算机科学领域中一种重要的排序算法,它由美国计算机科学家Donald Shell于1959年提出,因此得名希尔排序。希尔排序是一种...
包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,选择排序、插入排序、冒泡排序、希尔排序、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序...
- 排序算法:包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序等,它们的目标是将一组数据按特定顺序排列。 - 搜索算法:如线性搜索、二分搜索、广度优先搜索(BFS)和深度优先搜索(DFS)...
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序等排序算法的原理和实现。 - 查找算法:顺序查找、二分查找、哈希查找等,以及在不同数据结构中的应用。 4. **递归与动态规划**: - 递归...
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等。 - **查找算法**: - 顺序查找、折半查找、二叉搜索树查找等。 - **图算法**: - 深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra...
希尔排序法的基本思想是将待排序的序列分成若干个小组,每组进行插入排序,然后逐步合并小组,直到整个序列有序。 希尔排序法的时间复杂度为 O(n log n),空间复杂度为 O(1)。希尔排序法的优点是快速稳定,缺点是...
- 插入类排序法:简单插入排序、希尔排序。 - 选择类排序法:简单选择排序、堆排序。 #### 二、程序设计基础 1. **源程序文档化**: - 注释的重要性:提高代码的可读性和维护性。 - 分类:序言性注释(文件头...