希尔排序

希尔排序——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

排序之希尔排序(JS)

孤人 提交于 2020-02-09 05:25:30
  希尔排序(Shell's Sort)是 插入排序 的一种又称“ 缩小增量排序 ”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。   希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 为更加清晰地说明该排序,贴一张其它地方转载而来的图片 /* * 希尔排序 时间复杂度 o(nlog2n). * 开始时针对无序序列,步长大,交换速度有提升,当数组基本有序的时候,步长少,交换次数少,速度快 */ //不使用temp,交换数据信息 function swap(arr,i,j){ arr[i]=arr[i]+arr[j]; arr[j]=arr[i]-arr[j]; arr[i]=arr[i]-arr[j]; return arr; } //希尔排序,自组采用直接插入排序 针对有序序列在插入时采用交换法 function shellSort(arr){ //逐步降低步长直至为1为止 for(let shellWidth = arr.length/2;shellWidth>0;shellWidth/2){ /

算法系列【希尔排序】篇

|▌冷眼眸甩不掉的悲伤 提交于 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年 提出 而得名。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的

python-希尔排序

给你一囗甜甜゛ 提交于 2020-02-09 04:14:08
希尔排序 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 步骤 每次以一定步长(就是跳过等距的输)进行排序 #!/usr/bin/env python # coding:utf-8 def shellSort(nums): # 设定步长 step = len(nums)/2 while step > 0: for i in range(step, len(nums)): # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置 while i >= step and nums[i-step] > nums[i]: nums[i], nums[i-step] = nums[i-step], nums[i] i -= step step = step/2 return nums if __name__ == '__main__': nums = [9,3,5,8,2,7,1] print shellSort(nums) """ [1, 2

Java希尔排序

天涯浪子 提交于 2020-02-09 04:05:08
希尔排序 ,也称 递减增量排序算法 ,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行 直接插入排序 ,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 算法步骤 : 1)选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 2)按增量序列个数k,对序列进行k 趟排序; 3)每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 算法图示: 算法基本性能 排序算法 平均情况 最好情况 最坏情况 空间复杂度 稳定性 shell排序 O(N*logN) O(n) O(n 2 ) O(1) 不稳定 java代码 package com.sort; import java.util.Random; public class Main { // 从小到大 private static void sort(int[] array) { /** *

插入排序与希尔排序详解

﹥>﹥吖頭↗ 提交于 2020-02-08 19:14:44
插入排序 插入排序(Insertion sort)是一种简单直观且稳定的排序算法。有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法, 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据 ,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。 (摘自百度百科,黑体部分定义在很多博文中都有看到,但基本未见在代码中体现。博主认为是望文生义的概率比较大,所以以下面维基百科的定义为准) 维基百科: 插入排序工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间 算法描述如下: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该元素(已排序)大于新元素,将该元素移到下一位置 4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5.将新元素插入到该位置后 6.重复步骤2~5 如下图所示: 希尔排序 希尔排序(Shellsort),也称递减增量排序算法

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

ⅰ亾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},称为