由于考试耽搁了几天,不好意思~~~ 前面的介绍的三种排序算法,都属于简单排序,大家能够看下详细算法,时间复杂度基本都在0(n^2),这样呢,非常多计算机界.数学界的牛人就非常不爽了,他们在家里想啊想,吃饭的时候在想,窝粑粑的时候也在想,到底能不能把时间复杂度搞低点呢.最终,皇天不负有心人啊,王母娘娘显灵了,最终被DL. SHELL这哥们给想出来了.他所创造的希尔(shell)排序是世界上第一个打破0(n^2)的时间复杂度的算法.牛逼不? 好了,言归正传. 希尔排序: 希尔排序,也称递减增量排序算…
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let‘s go~~~ 1.排序算法的基本概念的讲解 时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数. 空间复杂度:分析需要多少辅助的内存. 稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的. 否则我们称这个排序算法是不稳定的…
希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h. 希尔排序的思想是使数组中任意间隔为h的元素有序.步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003....这种步长算法是经过论文证明为比较高效的步长. 最开始由最大步长开始排序,最大步长为 while(h < n/3) h = 3*h +1 步长最大时,比较的元素非常少,速度很快 后来步长逐渐缩短,比较的元素越来越多,但是此时元素的有序性也变好了,排序速度还是会很快. while(h>=1){…
基本思想: 希尔排序就是对直接插入排序的一个优化.现在有一个array,希尔排序就是设定一个增量incrementNum(0<incrementNum<array.length).先从array[0]开始,以incrementNum为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:以incrementNum为增量的进行直接插入排序; 然后从array[1]开始重复......一直到array[n].然后取一个小于上一步增量的新的增量(比如设置为incrementNum/2…
4-7 ShellSort.c #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define ARRAYLEN 10 //需要排序的数据元素数量 void ShellSort(int a[],int n)//希尔排序 { int d,i,j,x; d=n/; ) //循环至增量为1时结束 { for(i=d;i<n;i++) { x=a[i]; //获取序列中的下一个数据 j=i-d; //序列中前…
二.Shell排序 Shell排序也叫“缩减增量排序”(disminishing increment sort),基于插入排序进行. Shell建议的序列是一种常用但不理想的增量序列:1,...,N/8,N/4,N/2 (ht=N/2,hk=hk+1/2) void shellSort(vector<int> &a) { ;gap>;gap/=) { //对于hk(即gap),hk+1,...,N-1中的每个位置i,把位置i上的元素放到i,i-hk,i-2hk......中的正确…
Shell排序(希尔排序)算法Shell排序严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序. Shell排序的流程:1.将由n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对,......2.一次循环使每个序列对排序好顺序3.然后,再变为n/4个序列,再次排序.4.不断重复上述过程,随着序列减少最后为一个,也就完成整个排序 /** * Shell排序(希尔排序) * @author Red Ants(guangboyuan.cn) * 微信公众号:程序员之路…
1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过程,即可完成操作. 图解示例 //插入排序 //karllen @2015 void insertSort() { int i ,j ,temp; ;i<n;++i) //从第二个元素开始插入 { temp = a[i]; //a[i]会被覆盖,临时保存 j = i - ; &&a[j]…
shell排序: 这个排序的命名是来自发明者的名字,和排序的方法没有字面上的联系.所以不要因为名字而感觉很难.在K&R的C程序设计语言中书中只用了几行代码很简洁的实现了这个排序算法.那就来看看这个排序是如何实现的. 原理: 我们将所要排序的序列(大小为n)划分成组,组的数量一般是可以用这个序列的大小的一半来定义(也就是d = n/2),然后不断折半,而组的成员就是间隔为d的数分为一组.比如这边有个长度为8的数字序列要去排序,那我们就可以先将这个序列分成d=4组的,每个组有两个数,(这边的4就是8…
java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度的移动.当着写数据项拍过一趟序之后,希尔排序算法缩小数据项的间隔再进行排序,一次进行下去.进行这些排序时的数据项直接的间隔被称为增量,习惯上用字母h来表示增量 常用的h序列有Knuth提出,该序列从1开始,通过如下公式产生 h=3*h+1; 反过来程序需要反向计…