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实现 蓝桥杯 算法训练 1的个数
试题 算法训练 1的个数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入正整数n,判断从1到n之中,数字1一共要出现几次.例如1123这个数,则出现了两次1.例如15,那么从1 ...
- portapack发射GPS的信号实现GPS脱机模拟器
要注意portapack必须要购买带高精度晶振的版本,另外固件要刷gridRF版本,用官方的或者havoc的都不行. 固件在这下载: 链接: https://pan.baidu.com/s/16flB ...
- Django如何上传图片并对上传图片进行访问
通过一个示例的完整演示过程,来学习django如何上传图片,以及对于media文件夹中的上传图片进行请求: 1.配置settings.py MEDIA_URL = '/media/' MEDIA_RO ...
- .Net Core 配置之long类型 前端精度丢失和时间格式设置
在很多项目中,都采用的前后端分离的方式进行开发,经常遇到后台的long精度的数据到前端丢失不准确,显示效果为long类型(19位)的后几位为000,此时需要对long的字段进行设置,改变默认的返回类型 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 使用PyQtGraph绘制数据滚动图形(3)
import pyqtgraph as pg import numpy as np from pyqtgraph.Qt import QtGui, QtCore app = pg.QtGui.QApp ...
- throws,throw,try,catch,finally 分别代表什么 意义?
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口. 在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例.当一个方法出现异常后便 抛出一个异 ...
- Mac搭建Fluter应用环境
1.创建一个路径.例如我创建是: /Users/chenghui/ 然后创建一个文件夹: development 把下载好的Fluter 解压到当前目录下: development /Users/ch ...
- yaml读取封装
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 对yaml格式的配置文件的操作 """ ...
- APP——python——自动化环境搭建01
前提:python以及pycharm安装完成. ---------------------------------------------------------------------------- ...