shell排序法是怎么实现

作者&投稿:聊翰 (若有异议请与网页底部的电邮联系)
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排序是一种插入排序算法,它出自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的循环过程完成后,排序过程结束。

(详细请查看百度百科相关条目。)




《Hellsing》里,为什么阿卡多说“只有人类才能杀死怪物”?
沃尔特是integula多年的家庭女教师,她很有权势,被称为“人类死亡之神”。他愿意留在伦敦的对峙中,但默默地反抗了整个家庭,加入了吸血鬼一方,变成了一个年轻人,并与赤藤一起战斗至死。薛定谔的能力可以存在于任何地方,但却不存在于任何地方。这种能力法兹·阿卡多找不到自己。获得薛定谔能力的阿卡...

单机游戏 斩妖除魔 共有几部?按剧情排序的话依次是什么??谢谢、、、
2004出最经典的原作,英文名叫《Painkiller》,翻译有叫斩妖除魔,恐惧杀手,止痛剂等,这是要必玩的。同年出资料片《Painkiller:battle out of hell》(杀出地狱)以后的作品都是资料片,英文名称都是Painkiller后面加上资料片的名字,翻译的名字就是原作的翻译加上资料片的翻译。我下面就直接说资料片...

【急】【120分】请教EXCEL分类汇总怎么样才有分级显示?
1、排序 2、选择所有数据,然后点击〈数据〉-〈筛选〉-〈自动筛选〉3、点击〈数据〉-〈分类汇总〉你再看看你要的东西是否都有了?另外,〈汇总〉和〈分类汇总〉是两码事,不一样的,要分级显示的汇总一定是在〈数据〉下的〈分类汇总〉里操作。如果做完分类汇总后,点击了左上角的“1”,也就是说...

谁知道星期一到星期天的英文谐音记忆法
按默认排序|按时间排序 其他3条回答 2013-09-29 19:39热心网友 星期一:忙day 星期二:兔死day星期三:温死day星期四:舍死day星期五:法iday星期六:啥特day星期日:赏day 评论| 2013-09-29 19:31hell4you| 来自手机知道|二级 忙day? 回答 求死day 评论| 2013-09-29 19:32热心网友 我有啊 回答 星期...

鬼泣4一共有几个难度?各个难度通了之后会有什么奖励?
最关键的是出场的杂兵会出现兵种变化。远近结合的攻击组合是很常见的)通关后追加HELL AND HELL难度 并获得无限魔人装。LEAGEND OF DAKE KNIGHT难度(俗称的无双模式。这个模式下敌人的攻击力和血量和DEVIL HUNTER难度一样但是敌人的数量大大的增加是个赚魂的好难度。)通关后追加HEAVEN OR HELL难度HEAVEN ...

Java中的compareTo()函数是怎么用的?
如果这两个字符串相等,则结果为 0;compareTo 只有在方法 equals(Object) 返回 true 时才返回 0。 这是字典排序的定义。如果这两个字符串不同,则要么它们在某个索引处具有不同的字符,该索引对二者均为有效索引,要么它们的长度不同,或者同时具备上述两种情况。如果它们在一个或多个索引位置上具有...

试编写一个函数void sort(int n, double x[]),其功能是:将具有n个元素...
main(){ void sort(int x[],int n); 声明函数 int *p,i,a[10];p=a; p指向a的第一个元素 for(i=0;i<10;i++)scanf("%d",p++); 输入10个整数,作为a[10]的值 p=a; q指向a的首地址 sort(p,10); 对a的10个元素进行排序 for(p=a,i=0;i<10;i++)打印出a的所有数值 }...

一个银行没得一个老人贷款而发生的灾难的电影叫什么名字
堕入地狱Drag Me to Hell (2009) 导演: 山姆·雷米 主演: 贾斯汀·朗 艾莉森·洛曼 杰西卡·卢卡斯 国家\/地区: 美国 类型: 惊悚 \/ 恐怖 对白语言: 英语 发行公司: Prorom Media-Trade 上映日期: 2009年5月29日 美国 年轻漂亮的克里斯汀·布朗(艾莉森·洛曼饰)在洛杉矶的一家银行工作,她的职责是审核发放小额...

单机游戏 斩妖除魔 共有几部?按剧情排序的话依次是什么??谢谢、、、
2004出最经典的原作,英文名叫《Painkiller》,翻译有叫斩妖除魔,恐惧杀手,止痛剂等,这是要必玩的。同年出资料片《Painkiller:battle out of hell》(杀出地狱)以后的作品都是资料片,英文名称都是Painkiller后面加上资料片的名字,翻译的名字就是原作的翻译加上资料片的翻译。我下面就直接说资料片的翻译名字吧。按时...

北京市15050975350: 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排序:

北京市15050975350: shell排序算法 -
荡萍小儿: // shell排序 void ShellSort(int array[], int length) { int temp; // 增量从数组长度的一半开始,每次减小一倍 for (int increment = length / 2; increment > 0; increment /= 2) for (int i = increment; i{ temp = array[i]; // 对一组增量为increment的元素进行插...

北京市15050975350: 关于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}; ...

北京市15050975350: shell怎么按文件类型排序 -
荡萍小儿: 就是文件每行按照逐字按字典顺序比较大小,然后将行顺序,可以用sort命令排序 sort filename1 > newfilename1 sort filename2 > newfilename2 comm newfilename1 newfilename2

北京市15050975350: [求助] Shell排序算法
荡萍小儿: shellsort也叫间隔增序排序法外部的gap表示以gap为间隔进行几次大的排序(最外层的for)里面的两个for则是对gap未间隔的数据进行插入排序

北京市15050975350: 希尔排序的排序过程 -
荡萍小儿: 希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序. 排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,...

北京市15050975350: 希尔排序究竟是怎么排的? -
荡萍小儿: 希尔排序的算法思想 先将整个待排序元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的),分别进行直接插入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 希尔排序算...

北京市15050975350: SHELL排序怎么会事
荡萍小儿: 希尔排序是一种快速排序法,它出自D.L.Shell,因此而得名.Shell排序又称作缩小增量排序.基本思想:不断把待排序的对象分成若干个小组,对同一小组内的对象采用直接插入法排序,当完成了所有对象都分在一个组内的排序后,排序过程...

北京市15050975350: 希尔排序法原理?? -
荡萍小儿: 希尔排序法(缩小增量法) 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法.算法思想简单描述 在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助....

北京市15050975350: 如何用Shell脚本生成10个随机数并排序 -
荡萍小儿: i=1 while [ $i -le 10 ] do if [ $i -eq 1 ] then a[$i]=$RANDOM else j=$i a[$j]=$RANDOM while [ $j -ge 2 ] && [ ${a[$j]} -le ${a[$((j - 1))]} ] do t=${a[$j]} a[$j]=${a[$((j -1 ))]} a[$((j - 1))]=$t j=$((j - 1)) done fi i=$((i + 1)) done echo ${a[@]}

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网