当前位置:首页 » 操作系统 » shell算法

shell算法

发布时间: 2022-05-13 11:08:24

㈠ Shell排序的算法步骤

Step1 将n个元素个数列分为5个小组,在每个小组内按直接插入法排序;
step2 在第i步,分组个数取 di+1 =(di +1)/2 {9,5,3,2,1};相临两组之间的对应元素进行比较,如果ai>aj,则交换它们的位置;
Step3 当dK = 1的循环过程完成后,排序过程结束。
希尔排序举例:设有字符数列f d a c b e,执行Shell排序:

㈡ shell排序算法

很简单,这些问题你试着一步一步走下就知道了

就是从第一个数开始,判断第一个数和n/2那个数的大小,如果v[0]大于v[n/2]
就交换。
1 2 3 4 5 6

1与3比较,2与4比较,3与5比较...

㈢ 计算机上的“shell”是什么

计算机上的shell是壳(用来区别于核)的意思,是指“提供使用者使用界面”的软件(命令解析器)。
它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。在排序算法中,Shell是希尔排序的名称。
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

㈣ shell排序法是怎么实现

希尔Shell排序是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。

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

该方法实质上是一种分组插入方法。

算法分析

增量序列的选择

Shell排序的执行时间依赖于增量序列。

好的增量序列的共同特征:

① 最后一个增量必须为1;

② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在n到1.6n之间。

Shell排序的时间性能优于直接插入排序

希尔排序的时间性能优于直接插入排序的原因:

①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

②当n值较小时,n和n^2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n^2)差别不大。

③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

因此,希尔排序在效率上较直接插人排序有较大的改进。

稳定性

希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。

算法讨论

Shell排序算法的时间复杂度分析比较复杂,实际所需的时间取决于各次排序时增量的个数和增量的取值。研究证明,若增量的取值比较合理,Shell排序算法的时间复杂度约为O(n(ldn)2)。由于Shell排序算法是按增量分组进行的排序,所以Shell排序算法是一种不稳定的排序算法。

算法步骤

Step1 将n个元素个数列分为5个小组,在每个小组内按直接插入法排序;

step2 在第i步,分组个数取 di+1 =(di +1)/2 {9,5,3,2,1};相临两组之间的对应元素进行比较,如果ai>aj,则交换它们的位置;

Step3 当dK = 1的循环过程完成后,排序过程结束。

(详细请查看网络相关条目。)

㈤ shell模型的五大要点

有四大要点,硬件、软件、环境、人。

1、H,硬件,诸如设备、设施、工具、计算机。

2、S,软件,运行规则、硬件驱动软件、指令、法令、程序、文件。

3、E,环境,运作环境、工作场所、自然环境。

4、L,人,人的绩效、能力、局限。

相关拓展

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

在排序算法中,Shell是希尔排序的名称。

以上内容参考网络-shell

㈥ 这是一个SHELL排序法的例子,中间有点问题不懂

你好,希尔算法的基本思想是,利用一个增量序列,让待排序数组逐渐有序。
针对上面的算法,其实当gap等于1的时候,shell算法实际都退化成了简单插入排序。
至于楼主针对上面的算法提出的问题,的确,数组的3、4位置一定会比较多次,但是,有可能的是这两个位置的实际数值,已经不同。因为,先后两次比较的时候,整个待排序数组的位置已经有了改变。
不过,楼主上面的希尔算法可以进一步改进。让其减少无效的比较次数。

㈦ 关于C++中shell(希尔)排序的实现

#include "iostream.h"
void shellSort(int *arr, int len, int *p, int len1);
int main()
{
int num[15]={100,12,20,31,1,5,44,66,61,200,30,80,150,4,8};
int i;
cout<<"待排数据d=(5,3,1): ";
for(i=0;i<15;i++)
{
cout<<num[i]<<" ";
}
int s[3]={5,3,1};
shellSort(num,15, s,3);
cout<<"\n";
return 0;
}

void shellSort(int *arr, int len, int *p, int len1)
{
for (int i = 0; i < len1; i++)
{
int d = p[i];
for (int n = 0; n < d; n ++)
{
for (int j = n + d; j < len; j = j + d)
{
if (arr[j] < arr[j - d])
{
int tmp = arr[j];
for (int k = j - d; k >= 0 && arr[k] > tmp; k = k - d)
{
arr[k + d] = arr[k];
}
arr[k + d] = tmp;
}
}
}
cout<<"第"<<i+1<<"趟排序结果:";
for(int m=0;m<15;m++)
cout<<arr[m]<<" ";
cout<<"\n";
}
}

http://www.cppblog.com/shongbee2/archive/2009/04/25/81046.aspx

#include <stdio.h>
#include <stdlib.h>

//对单个组排序
int SortGroup(int* pnData, int nLen, int nBegin,int nStep)
{
for (int i = nBegin + nStep; i < nLen; i += nStep)
{
//寻找i元素的位置,
for (int j = nBegin; j < i; j+= nStep)
{
//如果比他小,则这里就是他的位置了
if (pnData[i] < pnData[j])
{
int nTemp = pnData[i];
for (int k = i; k > j; k -= nStep)
{
pnData[k] = pnData[k - nStep];
}
pnData[j] = nTemp;
}
}
}
return 1;
}
//希尔排序, pnData要排序的数据, nLen数据的个数
int ShellSort(int* pnData, int nLen)
{
//以nStep分组,nStep每次减为原来的一半。
for (int nStep = nLen / 2; nStep > 0; nStep /= 2)
{
//对每个组进行排序
for (int i = 0 ;i < nStep; ++i)
{
SortGroup(pnData, nLen, i, nStep);
}
}

return 1;
}

int main()
{
int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //创建10个数据,测试
ShellSort(nData, 10); //调用希尔排序

for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}

printf("\n");
system("pause");
return 0;
}

㈧ Shell排序的算法总结

下面几个算法有研究价值 /**D.Shell最初的算法。*/intshellsortSh(intp[],intn){intop=0;inth,i,j,temp;for(h=n/2;h>0;h=h/2){for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}shell排序算法C语言实现voidshellsort(intv[],intn){intgap,i,j,temp;for(gap=n/2;gap>0;gap/=2){for(i=gap;i<n;i++){for(j=i-gap;j>=0&&v[j]>v[j+gap];j-=gap){temp=v[j];v[j]=v[j+gap];v[j+gap]=temp;}}}}Lazarus-Frank 算法,1960 年发表。 /**原为在必要时加1使所有增量都为奇数,现修正为减1。*/intshellsortLF(intp[],intn){intop=0;inth,i,j,temp;for(h=n/2;h>0;h=h/2){if(h%2==0)h--;for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;} intshellsortGo(intp[],intn){intop=0;inth,i,j,temp;for(h=n;h>1;){h=(h<5)?1:(h*5-1)/11;for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}Incerpj-Sedgewick 算法,1985 年发表。 intshellsortIS(intp[],intn){intop=0;inth,i,j,t,temp;intincs[16]={/*a1=3,a2=7,a3=16,a4=41,a5=101*/1391376,/*a1*a2*a3*a4*a5*/463792,/*a2*a3*a4*a5*/198768,/*a1*a3*a4*a5*/86961,/*a1*a2*a4*a5*/33936,/*a1*a2*a3*a5*/13776,/*a1*a2*a3*a4*/4592,/*a2*a3*a4*/1968,/*a1*a3*a4*/861,/*a1*a2*a4*/336,/*a1*a2*a3*/112,/*a2*a3*/48,/*a1*a3*/21,/*a1*a2*/7,/*a2*/3,/*a1*/1};for(t=0;t<16;t++){h=incs[t];for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}

㈨ shell排序比快速排序快嘛

一般情况下快速排序是最快的。
快速排序若选第一个数或一个数为排序基准,而原始数据又基本有序时,会发生退化,效率降低为O(n^2)。此时在大数据下还会发生系统栈溢出。

所以,建议采用随机数选择排序基准,基本能保持O(nlog2n)r 高效率。

热点内容
集群服务器地址都是一样的吗 发布:2024-10-10 01:07:39 浏览:324
java怎么开平方 发布:2024-10-10 01:02:25 浏览:486
windowsserver更新服务器搭建 发布:2024-10-10 00:42:32 浏览:656
kz解压缩 发布:2024-10-10 00:27:19 浏览:667
方舟编译器呢 发布:2024-10-10 00:13:41 浏览:914
阿里云服务器安装图形 发布:2024-10-09 23:40:45 浏览:863
cb编译器怎么下 发布:2024-10-09 23:37:38 浏览:8
编译translation 发布:2024-10-09 23:24:23 浏览:10
服务器cpu能供多少电脑使用 发布:2024-10-09 23:05:21 浏览:350
算法和嵌入式 发布:2024-10-09 23:04:34 浏览:555