C#数据结构与算法系列(二十一):希尔排序算法(ShellSort)
1.介绍
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
2.基本思想
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
3.示意图
4.代码
using System; namespace DataStructure
{
public class ShellSort
{
/// <summary>
/// 测试希尔排序
/// </summary>
public static void Test()
{
int[] arr = { , , , , , , , , , }; Console.WriteLine("需要排序的数组:" + ArrayToString(arr)); Console.WriteLine("\n封装后的测试"); //测试封装后的希尔排序
Sort(arr); Console.WriteLine("\n封装前的测试"); arr = new int[] { , , , , , , , , , }; int temp = ;
//希尔排序第一轮
//因为第一轮排序,是将十个数据分成了五组
for (int i = ; i < arr.Length; i++)
{
//遍历各组中所有元素(10/2=5)步长五
for (int j = i - ; j >= ; j -= )
{
if (arr[j] > arr[j + ])
{
temp = arr[j]; arr[j] = arr[j + ]; arr[j + ] = temp;
}
}
} Console.WriteLine("\n第一轮希尔排序的结果:" + ArrayToString(arr)); //3,5,1,6,0,8,9,4,7,2 //希尔排序第二轮
//因为第二轮排序,是将十个数据分成了5/2=2组
for (int i = ; i < arr.Length; i++)
{
for (int j = i - ; j >= ; j -= )
{
if (arr[j] > arr[j + ])
{
temp = arr[j]; arr[j] = arr[j + ]; arr[j + ] = temp;
}
}
} Console.WriteLine("\n第二轮希尔排序的结果:" + ArrayToString(arr)); //希尔排序第三轮
//因为第三轮排序,是将十个数据分成了2/2=1组
for (int i = ; i < arr.Length; i++)
{
for (int j = i - ; j >= ; j -= )
{
if (arr[j] > arr[j + ])
{
temp = arr[j]; arr[j] = arr[j + ]; arr[j + ] = temp;
}
}
} Console.WriteLine("\n第三轮希尔排序的结果:" + ArrayToString(arr));
} /// <summary>
/// 封装希尔排序
/// </summary>
/// <param name="arr"></param>
private static void Sort(int[] arr)
{
int temp = ; int count = ;
//遍历各组中的所有元素(共gap组,每组有个元素),步长gap
for (int gap = arr.Length / ; gap > ; gap /= )
{
for (int i = gap; i < arr.Length; i++)
{
for (int j = i - gap; j >= ; j -= gap)
{
//如果当前元素大于加上步长后的那个元素,说明交换
if (arr[j] > arr[j + gap])
{
temp = arr[j]; arr[j] = arr[j + gap]; arr[j + gap] = temp;
}
}
} Console.WriteLine($"\n第{++count }轮希尔排序的结果:{ArrayToString(arr)}");
}
} private static string ArrayToString(int[] arr)
{
return string.Join(",", arr);
}
}
}
5.演示结果
C#数据结构与算法系列(二十一):希尔排序算法(ShellSort)的更多相关文章
- Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始
1. 前言 本文将介绍希尔排序.归并排序.基数排序(桶排序).堆排序. 在所有的排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. ...
- 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】
<Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 ...
- python算法与数据结构-希尔排序算法(35)
一.希尔排序的介绍 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每 ...
- 排序系列 之 希尔排序算法 —— Java实现
基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...
- Java排序算法(四)希尔排序2
Java排序算法(四)希尔排序2 希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { ...
- 插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良.因此直接插入算法是基础,这里先进行直接插入算法的分析与编码. 直接插入算法的排序思想:假设有 ...
- 【排序算法】希尔排序算法 Java实现
希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎 ...
- 算法-java代码实现希尔排序
希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2 ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 算法学习导图+经典排序算法PHP实现
周末抽时间整理下算法,完整导图可点击下面链接获取. 点我看完整算法导图 八种排序算法的php实现 代码如下 拷贝后可直接运行 先上个运行后的图 代码:(有的自己些的 有的根据网友整理) <?ph ...
随机推荐
- Java实现 LeetCode 143 重排链表
143. 重排链表 给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节 ...
- Java中Iterator 和ListIterator的区别
1.Iterator Iterator的定义如下: public interface Iterator {} Iterator是一个接口,它是集合的迭代器.集合可以通过Iterator去遍历集合中的元 ...
- 第六届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.三角形面积 题目描述 如图1所示.图中的所有小方格面积都是1. 那么,图中的三角形面积应该是多少呢? 请填写三角形的面积.不要填写任何 ...
- Java实现LeetCode_0020_ValidParentheses
package javaLeetCode.primary; import java.util.Scanner; import java.util.Stack; public class ValidPa ...
- java实现取字母组成串
** 取字母组成串** A B C D中取5次,每个字母都可以重复取出,形成一个串. 现在要求,串中A出现的次数必须为偶数(0次也算偶数). 求可以形成多少种可能的串. 参考答案: 528 publi ...
- Linux 系统定时任务
crond服务管理与访问控制 启动 service crond restart 开机自启动 chkconfig crond on 用户的crontab设置 crontab [选项],其中 -e :编辑 ...
- 终于我用JOL打破了你对java对象的所有想象
目录 简介 JOL简介 使用JOL分析VM信息 使用JOL分析String 使用JOL分析数组 使用JOL分析自动装箱 使用JOL分析引用关系 总结 简介 使用面向对象的编程语言的好处就是,虽然没有女 ...
- FTP配置多用户多目录多权限
环境介绍 根据开发的需求 要求创建FTP服务器,把前端和后端分开用不同的FTP账号 系统环境 centos 7.4 selinux 关闭 防火墙关闭 安装FTP 很简单就一条命令 yum instal ...
- ElasticSearch6.3脚本更新
使用上篇文章创建的索引进行学习:https://www.cnblogs.com/wangymd/p/11200996.html 官方文档:https://www.elastic.co/guide/en ...
- POJ - 2184 Cow Exhibition 题解
题目大意 有 \(N(N \le 100)\) 头奶牛,没有头奶牛有两个属性 \(s_i\) 和 \(f_i\),两个范围均为 \([-1000, 1000]\). 从中挑选若干头牛,\(TS = \ ...