导航:首页 > 源码编译 > 希尔排序算法

希尔排序算法

发布时间:2022-01-22 11:50:12

A. 希尔排序(c语言)

void ShellSort(int r[],int n)//希尔排序
{
for(int gap=n/2;gap>=1;gap=gap/2)//以增量为d进行直接插入排序
{
CountCompare[1]++;
for(int i=d+1;i<=n;i++)//将r[i]插入到所属的子序列中
{
r[0]=r[i];//暂存被插入记录
CountMove[1]++;
for(int j=i-d;j>0&&r[0]<r[j];j=j-gap)
{
r[j+d]=r[j];//记录后移gap个位置,保证仍在同一个子序列
CountCompare[1]++;
CountMove[1]++;
}
r[j+gap]=r[0];
CountMove[1]++;
}
for(int k=1;k<=n;k++)
cout<<r[i]<<" ";
}
}
//主程序就麻烦自己写了

B. 希尔排序算法

希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。

希尔排序基本思想

基本思想:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

详细资料:http://bk..com/view/178698.htm

C. 希尔排序法属于哪一类型的排序法

(1)交换类排序法交换类排序法是指借助数据元素之间的互相交换进行排序的一种方法。冒泡排序法与快速排序法都属于交换类排序方法。冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为n(n–1)/2。但这个工作量不是必需的,一般情况下要小于这个工作量。快速排序法也是一种交换类的排序方法,但由于它比冒泡排序法的速度快,因此称之为快速排序法。其关键是对线性表进行分割,以及对各分割出的子表再进行分割。(2)插入类排序法插入类排序法主要有简单插入排序法和希尔排序法。简单插入排序法,是指将无序序列中的各元素依次插入到已经有序的线性表中。在这种排序方法中,每一次比较后最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同。在最坏情况下,简单插入排序需要n(n–1)/2次比较。希尔排序法对简单插入排序做了较大的改进。它是将整个无序序列分割成若干小的子序列分别进行插入排序。希尔排序的效率与所选取的增量序列有关。在最坏情况下,希尔排序所需要的比较次数为O(n1.5)。(3)选择类排序选择类排序主要有简单选择类排序法和堆排序法。简单选择排序法的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置);然后对剩下的子表采用同样的方法,直到子表空为止。对于长度为n的线性表,在最坏情况下需要比较n(n–1)/2次。堆排序法也属于选择类排序法。具有n个元素的序列(h1, h2, …, hn),当且仅当满足条件: 或 (i=1, 2, …, n/2)时称之为堆。可见,堆顶元素(即第一个元素)必为最大项。堆排序的方法对于规模较小的线性表并不适合,但对于较大规模的线性表来说是很有效的。在最坏情况下,堆排序需要比较的次数为O(nlog2n)。

如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la

D. 希尔排序的详解

希尔排序基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

举例说明:

对于这样一个无序的数组5932611817410,想把它变成顺序递增的数组1234567891011。先隔3个元素取一次:把5284取了出来,往后搓一位,把96110取出来,再往后搓一位,又把3117取出来。分别对这三个小组排序成为递增的序列,再插回去,如图:

于是得到了第一趟排序的结果:2134675911810.现在再以2为间隔重复以上步骤(这次得到的是两个小组)得到了2134576811910。最后再以1为间隔再搞一次(实际上这一步就是从左到右两两比较,调整位置),就得到了想要的结果。

这就是希尔排序,其要义就是先进行宏观调整,再进行微观调整。

E. 各种排序算法,要求输出排序过程,希尔排序算法排出来的顺序不对,下面是我的代码和截图: //希尔排序

你的for语句后面没有用{};

F. 希尔排序问题

是49上面有一横。这是因为有两个49。加一横是为了区分它们。

G. 希尔排序算法的思想是什么

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

H. 谁能给我解释一下希尔排序算法

我用C给你写一个吧
void ShellSort(int *a, int n)
{
//循环变量
int i = 0;
int j = 0;
//控制增量
int k = n / 2;
int temp = 0;

while (k > 0)
{
for (i = k; i < n; i += k)
{
temp = a[i];
for (j = i - k; j >= 0 && temp < a[j]; j -= k)
{
a[j + k] = a[j];
}
a[j + k] = temp;
}
k /= 2;
}

I. 希尔排序法特点

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因希尔于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,由相隔某个“增量”的元素组成的,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序,增量足够小时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,接近最好情况,效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。希尔排序法属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法。希尔排序的特点
希尔排序算法与步长有直接关系。步长依次递减,数组的局部越来越有序了。希尔排序算法思想
因为希尔排序是通过比较相距一定间隔的元素来工作的。所以先要自定义步长的范围。然后选择一个当前元素,依次按照步长来寻找指定步长的元素进行比较,比较选择出最小的元素,如果比当前元素小于指定步长的元素,就进行交换,相反就退出当前的循环查找比较。

阅读全文

与希尔排序算法相关的资料

热点内容
单片机下载口叫什么 浏览:186
程序员的道 浏览:924
云服务器不实名违法吗 浏览:556
怎样查看文件夹图片是否重复 浏览:993
文件怎么导成pdf文件 浏览:805
打开sql表的命令 浏览:101
安卓手机如何面部支付 浏览:37
天元数学app为什么登录不上去 浏览:822
明日之后为什么有些服务器是四个字 浏览:102
安卓系统l1是什么意思 浏览:24
服务器一直崩应该用什么指令 浏览:922
cm202贴片机编程 浏览:727
php构造函数带参数 浏览:178
解压电波歌曲大全 浏览:344
为啥文件夹移到桌面成word了 浏览:858
命令符的安全模式是哪个键 浏览:758
编程中学 浏览:956
单片机求助 浏览:995
ug加工侧面排铣毛坯怎么编程 浏览:273
程序员有关的介绍 浏览:738