gap

【DS】排序算法之希尔排序(Shell Sort)

让人想犯罪 __ 提交于 2020-02-13 02:00:14
一、算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1)插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率; 2)插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位; 我们将数组中两个元素之间的距离称为Gap,相邻元素之间的Gap自然是1,很明显的,插入排序的算法在调节元素的时候,Gap是1,这就造成了上面讲的低效的原因2)。因此希尔排序的思想如下: 1)假设序列的元素个数是n,选取一个初始Gap的d(d<n); 2)将序列中元素之间距离(即Gap)为d的元素分为一组,在每组之间直接进行插入排序; 3)全部完成以后,缩小Gap至d1(d1<d),然后继续2)直到Gap为1; 常见的Gap序列如下: 1)希尔原本的Gap:N/2、N/4、...1(反复除以2) 2)Hibbard的Gap:1、3、7、...、2k-1(k表示第几个gap) 3)Knuth的Gap: 1、4、13、...、(3k - 1) / 2(k表示第几个gap) 4)Sedgewick的Gap: 1、5、19、41、109、... 二、算法示意图 如图所示,展示了分组和排序的过程。第一行是分组的过程,总共有8个元素,Gap为8/2=4,标记为相同颜色的元素为一组

希尔排序——python3.7中为双斜杠“//”

有些话、适合烂在心里 提交于 2020-02-11 19:07:08
文章目录 希尔排序(缩小增量排序) 希尔排序(缩小增量排序) 插入排序的一种,非稳定非序算法 希尔排序是将记录按下标的一定增量分组,对每组使用直接插入排序算法排序 def shell_sort ( alist ) : n = len ( alist ) # 初始步长 gap = n // 2 while gap > 0 : # 按照步长进行插入排序 for i in range ( gap , n ) : j = i # 插入排序 while j >= gap and alist [ j - gap ] > alist [ j ] : alist [ j - gap ] , alist [ j ] = alist [ j ] , alist [ j - gap ] j -= gap # 得到新的步长 gap = gap // 2 alist = [ 54 , 26 , 93 , 17 , 77 , 3 , 44 , 55 , 20 ] shell_sort ( alist ) print ( alist ) [3, 17, 20, 26, 44, 54, 55, 77, 93] 来源: CSDN 作者: 我是小杨我就这样 链接: https://blog.csdn.net/weixin_44478378/article/details/104264895

希尔排序用插入实现

醉酒当歌 提交于 2020-02-11 12:06:48
在数据为8万的时候与插入排序速度差不多。在80万的时候明显拉开差距代码如下 package a; import java.util.Arrays; public class InsetShell { public static void main(String[] args) { // int var = 8; int var = 800000; int [] arr = new int[var]; for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*80000000); } long sta = System.currentTimeMillis(); for (int gap = arr.length/2; gap>0; gap/=2) {//这个就是希尔排序的思路,一直2 知道最后 是1 for (int i =gap ; i < arr.length; i++) {//这个是用于次数,每一次找到一个,所以也就是少了gap次 int index = i; int value = arr[index];//这个就是用于记录当前变量 上边是索引 while (index-gap>=0&&arr[index] < arr[index - gap]) {//前边为什么要用-gap,是为了数据下标 arr

算法系列【希尔排序】篇

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-09 05:18:56
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度 : 1. 平方阶 (O(n2)) 排序各类简单排序:直接插入、直接选择和冒泡排序。 2. 线性对数阶 (O(nlog2n)) 排序快速排序、堆排序和归并排序; 3. O(n1+§))排序,§ 是介于 0 和 1 之间的常数。希尔排序 4. 线性阶 (O(n)) 排序基数排序,此外还有桶、箱排序。 关于稳定性 : 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释 : n :数据规模 k :“桶”的个数 In-place :占用常数内存,不占用额外内存 Out-place :占用额外内存 稳定性 :排序后 2 个相等键值的顺序和排序之前它们的顺序相同 希尔排序 希尔排序(Shell Sort)是插入 排序 的一种。是针对直接插入排序 算法 的改进。该方法又称缩小 增量 排序,因DL.Shell于1959年 提出 而得名。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的

使用jQuery Mobile和Phone Gap开发Android应用程序

谁都会走 提交于 2020-02-08 19:21:18
使用jQuery Mobile和Phone Gap开发Android应用程序 1、 软件准备 要进行android app的开发,当然需要准备Java, eclipse和安装Android SDK,这个部分网络上面很多方法,搜索“安装Android SDK”即可找到很多答案,所以就不再这里浪费口水。 2、 知识准备 (1)了解jQuery Mobile这个js框架,知道怎么组织一个简单的页面。 官方网站:http://jquerymobile.com/(记得下载一个js库文件) (2)了解Phone Gap,怎么利用Phone Gap在后面的内容也有介绍。 官方网站:http://phonegap.com/(同样记得下载相关文件) (3)能够使用jQuery进行开发。 3、 组织工程目录 (1)打开Eclipse,建立一个android应用工程,见下图 (2)解压phonegap的压缩包,可以看到它针对不懂的应用类型进行了不同的分类,有android、IOS、Windows Phone等移动终端系统,打开其中的android文件夹。 (3)在刚才新建的工程的根目录下新建一个名为libs的文件夹,找到(1)中android文件夹中的jar包粘贴到刚才的libs文件夹下。 (4)将(1)中android文件夹下的xml文件夹整个粘贴到工程更目录下的res文件夹下。 (5

python数据结构与算法:

走远了吗. 提交于 2020-02-07 10:04:42
快排:最优复杂度 O(n*logn) 最坏时间复杂度O(n^2)平均时间复杂度n^(1.3) 归并排序:最优/平均/最坏 时间复杂度均O(nlogn),但是内存占用为list大小的两倍,算法稳定 ############################## p5 排序 ################################### def bubble_sort(alist): """顺序表实现bubble""" n=len(alist) for j in range(0,n-1):#遍历次数,没遍历一次 遍历长度-1 遍历j次 -j count = 0 for i in range(0,n-1-j):#一次循环找到最大值,并且移动到最后位置 主体 if alist[i]>alist[i+1]: alist[i],alist[i+1]=alist[i+1],alist[i] count+=1 if 0 == count: return #####count 优化 不交换数字 不增加计数 def choose_sort(alist): """选择排序:找到最小的数字,放到最前面""" min = 0 n = len(alist) for j in range(0,n-2): min = j for i in range(j+1,n): if alist[min]>alist

图解排序算法(二)之希尔排序

ⅰ亾dé卋堺 提交于 2020-02-07 09:21:58
图解排序算法(二)之希尔排序   希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n 2 )的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。   我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2

图解排序算法(二)之希尔排序

半城伤御伤魂 提交于 2020-02-07 09:21:29
 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n 2 )的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。   我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为 增量序列

图解排序算法(二)之希尔排序

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-07 09:19:32
  希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n 2 )的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。   我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为

希尔排序

陌路散爱 提交于 2020-02-06 11:19:45
b站看到,自写练习 思想: 1,就是在插入排序的基础上每次让他跳跃式的进行交换排序,每一轮排序完后让gap的值减为上次的一半,缩小跳跃间隔,再次进行排序,当gap==1的时候,就是插入排序,具体代码如下 2,平均时间复杂度 O(nlogn) import java.util.Arrays; public class Sort { public static void main(String[] args) { int[] arr = {19,91,8,17,1,9,5,99,9,56,2,94,56,22}; // quickSort(arr, 0, arr.length - 1); xierSort(arr); System.out.println(Arrays.toString(arr)); } public static void xierSort(int[] arr) { int gap=arr.length; while (true) { gap=gap/2; for(int i=0;i<gap;i++) { for(int j=gap+i;j<arr.length;j+=gap) { int temp=arr[j]; int k=j-gap; //如果不把k设为j-gap可能会有数组越界的风险,我用k=j 一直没有算对, while (k>=0&&arr[k]>temp