原理:每隔sp(整数)个数即取数并判断大小,交换,先构造局部有序序列,直到sp为1,构造完整的有序序列。

给出一组数据,如下:

0

1

2

3

4

5

6

7

8

9

49

38

65

97

76

13

27

49

55

4

对这个数据,将sp设为5,即先取49,与13比较,进行交换;再取38,与27对比,进行交换,以此内推。终止条件是76与4对比完。至此,我们可以写出如下希尔函数的核心部分:

for(i=0;i<n-sp;i++)

for(j=i;j<n-sp;j+=sp)

if(a[j]>a[j+sp])

{

t=a[j];a[j]=a[j+sp];a[j+sp]=t;

}

当然,这仅仅是走完了排序的第一趟!要完成真正的排序,还要进行循环!

一、C语言版

1、希尔函数

void ssort(int a[],int n,int sp) //n为数据大小,sp为间隔

{

int i,j,t;

for(i=0;i<n-sp;i++)

for(j=i;j<n-sp;j+=sp)

if(a[j]>a[j+sp])//如果前面你的大于后面的,则进行交换

{

t=a[j];a[j]=a[j+sp];a[j+sp]=t;

}

}

我们知道,希尔排序一趟是排不出最终结果的,sp要从大到小,最后取到1才能完成,于是在主调函数里要调用多次ssort函数(如下面main函数里的标红部分),于是我们将多个sp综合到一个数组里,再将这个数组套入循环,即可得到一个新的函数,这样在主函数里就可以直接调用该函数了,如下:

void shellsort(int a[],int n,int d[],int dn) //dn为sp的个数

{

int i;

for(i=0;i<dn;i++)

ssort(a,n,d[i]);

}

2、main函数

main()

{

inta[10]={49,38,65,97,76,13,27,49,55,4},j;

int d[]={5,3,1};

//ssort(a,10,5);

//ssort(a,10,3);

//ssort(a,10,1);

shellsort(a,10,d,3);//一次调用多个循环

for(j=0;j<10;j++)

printf("%d  ",a[j]); //打印最后排序结果

printf("%d\n");

}

3. 结果显示

二、C#版

1. 构造算法类

class XiEr
{public void ssort(int[] a, int n, int sp){int i, j, t;for (i = 0; i < n - sp; i++)for (j = i; j < n - sp; j += sp)if (a[j] > a[j + sp]){t = a[j]; a[j] = a[j + sp]; a[j + sp] = t;}}public void shellsort(int[] a, int n, int[] d, int dn){int i;for (i = 0; i < dn; i++)ssort(a, n, d[i]);}
}

2. 前端调用

private void button1_Click(object sender, EventArgs e){int j;int[] a = { 49, 38, 100, 97, 76, 13, 27, 49, 55, 4 };int[] d = { 5, 3, 1 };XiEr xier = new XiEr();xier.shellsort(a, 10, d, 3);listBox1.Items.Clear();string tt = "";for (j = 0; j < 10; j++)tt = tt + a[j].ToString() + '\t';listBox1.Items.Add(tt);}

3. 结果显示

【经典回放】多种语言系列数据结构算法:希尔排序(C/C#版)相关推荐

  1. 【经典回放】多种语言系列数据结构算法:栈(JavaScript版)

    本文采用JavaScript语言实现栈结构算法并举例应用. JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: var s=new Array( ...

  2. 【经典回放】多种语言系列数据结构算法:二叉树(C#版)

    实验任务描述 1 用C#语言完成二叉树的类.并构造出一个二叉树: 2 用递归方法完成二叉树的遍历: 3 泛型的二叉树遍历之一.用队列给出遍历结果 4 泛型的二叉树遍历之二.委托方式给出二叉树遍历结果 ...

  3. 【经典回放】多种语言系列数据结构算法:串(C版)

    我们这里说的串.就是标准的C语言的串,这点,和我们教材中另行定义的串并不一致.我们这里强调仅仅是按C语言的标准处理串,是因为你会按C语言的标准构造串.而不是按其它的模式定义的.在我们的教材上,串相当与 ...

  4. 【经典回放】多种语言系列数据结构算法:队列(C版)

    一.队列ADT以及C语言实现 1 队列的原理以及ADT分析 队列是说:把一些数据按先进先出来组织,如同日常生活中的排队过程. 队列最主要的操作是 <1> 数据加入队列:<2> ...

  5. 【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版)

    1 二叉树类的设计以及二叉树遍历 要完成二叉树的类设计,最好把链表下的Node.js复制过来,相比链表的结点,二叉树仅仅是多了一个结点指针而已.略加修改后,就是: function TNODE(DAT ...

  6. 【经典回放】多种语言系列数据结构算法:希尔排序

    [希尔排序原理]每隔sp(整数)个数即取数并判断大小,交换,先构造局部有序序列,直到sp为1,构造完整的有序序列. 给出一组数据,如下: 0 1 2 3

  7. 【经典回放】多种语言系列数据结构算法:基数排序

    目录 一.算法思路 二.C#语言实现 三.C语言实现 一.算法思路 1. 思想基础 基数排序的思想就是先找出待排序中的最大者,然后按最大者申请一个足够大的内存空间,并将其初始化为零,然后将所有待排序的 ...

  8. 【经典回放】多种语言系列数据结构算法:归并排序

    目录 干货1:C#语言实现归并排序! 干货2:C语言实现归并排序! 干货1:C#语言实现归并排序! 一.算法 1.思想基础

  9. 【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版)

    目    录 一.树的C#语言实现以及显示 二.树的JavaScript语言实现以及显示 三.树的VB6语言实现以及显示 一.树的C#语言实现以及显示 1

最新文章

  1. R语言ggplot2可视化在ggplot2生成的可视化结果下方显示文本:显示一些关于数据的信息
  2. 笔记本禁用自带键盘攻略-------针对shift默认按下的解决方案
  3. 【微信小程序】报错信息合集
  4. nedc和epa续航里程什么意思_NEDC、WLTP和EPA续航里程标准谁最真实?看比亚迪工程师怎么说...
  5. 前端学习(1684):前端系列实战课程之判断游戏结束
  6. ES6新特性_ES6集合介绍与API---JavaScript_ECMAScript_ES6-ES11新特性工作笔记030
  7. k-means及变种
  8. 数据库表迁移到阿里云的方法有哪些
  9. 查看 Oracle 是用spfile 启动还是 pfile 启动
  10. 使用框架建立富联网应用
  11. 广东石油化工学院大学计算机基础,落实广东石油化工学院关于公布2013年度实验课题项目的通知...
  12. 百度C语言面试题2017,百度C语言面试题
  13. 小孔子内容管理系统V2.0测试
  14. no-cache和no-store的区别
  15. install Oracle JDK in Linux:安装oracle JDK in linux
  16. Easy_RL 01:强化学习基础
  17. FNN 网络介绍与源码浅析
  18. PHOTOSHOP基本概念解释【转】
  19. getchar,putchar与gets,puts的区别
  20. 计算机学院档案馆教育部,我系本科生团队参加全国高校档案学专业大学生创新性课外科技作品展...

热门文章

  1. CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
  2. C#9.0 每个开发人员都必须知道的4个特性
  3. 这个时代最重要的技能之一(数据分析)
  4. 从代码角度揭示:华为鸿蒙的“套壳”真相!
  5. 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
  6. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记
  7. Java面试必问JVM调优,那.NET5呢?
  8. 工作这几年所获、所感、所悟
  9. C#刷剑指Offer | 从上到下打印二叉树
  10. .NET Core + Kubernetes:Deployment