算法:希尔排序(Shell Sort)
背景
在三种简单的排序算法中(冒泡、选择和插入)插入排序的算法最好,不过插入过程可能需要进行大量的移动,如何尽可能少的移动元素呢?希尔排序正是基于对这个问题的思考而想出来的,考虑到希尔排序对已排序数组的排序效率尤为好(接近O(n)),因此希尔排序会先按照较大的间隔,对间隔的元素进行插入排序,然后将间隔缩小重复上述过程,直到间隔为 1。
实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DataStuctureStudy.Sorts
{
class ShellSort
{
public static void Sort(int[] items)
{
var h = ;
while (h <= (items.Length - ) / )
{
h = * h + ;
} // 对间隔为 h 的元素进行排序,如:(0,h,2h)、(1,h + 1,2h + 1)。
while (h >= )
{
// 将 outer 对应的元素按照插入排序的算法(间隔为 h)插入到指定的位置。
// h 之前的元素都是已排序的。
for (var outer = h; outer < items.Length; outer++)
{
var temp = items[outer];
var inner = outer;
while (inner >= h && items[inner - h] > temp) // 闲了得思考一下:不变量和 while。
{
items[inner] = items[inner - h];
inner = inner - h;
}
items[inner] = temp;
}
h = (h - ) / ;
}
}
}
}
备注
间隔的选择是一个关键因素,这里我选择了一个大家经常使用的算法。
算法:希尔排序(Shell Sort)的更多相关文章
- 排序算法--希尔排序(Shell Sort)_C#程序实现
排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...
- [算法] 希尔排序 Shell Sort
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是: ...
- 希尔排序Shell sort
希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 ...
- Python排序算法——希尔排序(Shell’s Sort)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...
- 排序之希尔排序(shell sort)
前言 本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此:一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自 ...
- 希尔排序——Shell Sort
前言: 数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;数据序列2: 13-17-20-42-14 利用插入排序,13-14 ...
- 希尔排序( Shell Sort)
原文地址:http://www.stoimen.com/blog/,在此感谢作者! Insertion sort is a great algorithm, because it’s very int ...
- C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)
希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...
- 数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)
数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...
- 数据结构和算法(Golang实现)(22)排序算法-希尔排序
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...
随机推荐
- C#socket编程序(三)
private void ReceiveData() { bool keepalive = true; Socket s = clientSocket; Byte[] buffer = new Byt ...
- Kubernetes Ingress实战
本节内容: 服务发现与负载均衡 Ingress实战 一.服务发现与负载均衡 在前面的安装部署kubernetes集群中已经简单用示例来演示了Pod和Service,Kubernetes通过Servic ...
- KAFKA随机产生JMX 端口指定的问题
https://blog.csdn.net/weixin_40209426/article/details/82217987
- MySQL慢查询优化
MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在大量数据进行比对或聚合时.磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的 ...
- python开发学习-day16(Django框架初识)
s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- 因为修改linux selinux修改错误产生的问题及解决办法
会出现这个错误: not syncing attempted to kill init 解决办法是: 开机后一直按e 然后按这个修改: https://www.deep-silver.com/kern ...
- Ionic实战八:ionic登陆页面源码
onic登陆页面模板源码,可以用于ionic开发中登陆页面制作或者参考 下面是此模板的一些页面 此模板免费提供给大家 登陆用户名和密码都是 phonegap100     
- Windows 中打开 shell
按住 Shift,单机鼠标右键"在当前目录打开命令窗口"
- 网络数据修改工具netsed
网络数据修改工具netsed 通过修改网络数据,可以绕过软件和防火墙的限制,达到特定的目的.Kali Linux提供一个简易数据修改工具netsed.该工具支持对TCP和UDP的数据进行修改.渗透 ...
- hdu 4536 dfs
题意:XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选 ...