希尔排序

数据结构:希尔排序

夙愿已清 提交于 2020-01-01 21:15:47
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。 1 void shell_sort1(int a[], int n) 2 { 3 int i,j,gap; 4 // gap为步长,每次减为原来的一半。 5 for (gap = n / 2; gap > 0; gap /= 2) 6 { 7 // 共gap个组,对每一组都执行直接插入排序 8 for (i = 0 ;i < gap; i++) 9 { 10 for (j = i + gap; j < n; j += gap) 11 { 12 // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。 13 if (a[j] < a[j - gap]) 14 { 15 int tmp = a[j]; 16 int k = j -

[常用排序算法] 希尔排序 (Shell Sort)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-25 12:07:22
一 基本思想 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 希尔排序是把元素按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个数组被分成一组,算法便终止。 二 算法描述 来看下希尔排序的基本步骤,在此我们选择增量 gap = length / 2,缩小增量继续以 gap = gap / 2 的方式,这种增量选择我们可以用一个序列来表示,{n / 2, (n / 2) / 2 … 1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述: 选择一个增量序列 t1,t2,…,tk,其中 ti > tj,tk = 1; 按增量序列个数 k,对序列进行 k 趟排序; 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序

希尔排序

为君一笑 提交于 2019-12-20 12:34:57
希尔排序 算法思想:先将待排序记录序列分割成若干个“稀疏的”子序列,分别进行直接插入排序。 1.首先选定记录见的距离为d1(一般情况下d=a.length/2),在整个待排序记录中将所有间隔为d1 的记录分成一组,进行组内直接插入排序; 2.然后取i=i+1,记录见的距离为di,在整个待排序列记录序列中,将所有间隔为di的记录分成一组,进行组内直接插入排序 做一个循环,知道d=1为止,完成整个排序过程 /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package paixu ; import java . util . Arrays ; public class PaiXu { public static void main ( String [ ] args ) { int [ ] a = { 48 , 62 , 35 , 77 , 55 , 14 , 35 , 98 , 0 } ; ShellInsert ( a ) ; System . out . println

c/c++实现希尔排序

给你一囗甜甜゛ 提交于 2019-12-16 09:25:04
希尔排序 - 插入排序的改进版。为了减少数据的移动次数,在初始序列较大时取较大的步长,通常取序列长度的一半,此时只有两个元素比较,交换一次;之后步长依次减半直至步长为1,即为插入排序,由于此时序列已接近有序,故插入元素时数据移动的次数会相对较少,效率得到了提高。 时间复杂度:通常认为是O(N3/2) ,未验证  稳定性:不稳定 /*希尔排序*/ 2 void shellSort ( vector < int > & arr , int bgn , int end ) 3 { 4 for ( int step = ( end - bgn ) / 2 ; step > 0 ; step / = 2 ) 5 { 6 for ( int i = bgn ; i < bgn + step ; ++ i ) 7 { 8 /* 9 * 以下,insertSort的变异 10 */ 11 for ( int j = i + step ; j < end ; j + = step ) 12 { 13 int k = j - step ; 14 for ( ; k >= i ; k - = step ) 15 if ( arr [ k ] <= arr [ j ] ) 16 break ; 17 if ( k != j - step ) 18 { 19 int tmp = arr [ j ] ; 20

排序算法之希尔排序

ぐ巨炮叔叔 提交于 2019-12-16 04:24:30
希尔排序 /希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 //希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。 2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 function shellsSort ( arr : number [ ] ) { let len = arr . length ; for ( let gap = Math . floor ( len / 2 ) ; gap > 0 ; gap = Math . floor ( gap / 2 ) ) { //希尔排序中外层步长 for ( let i = gap ; i < len ; i ++ ) { //开始插入排序 for ( let j = i - gap ; j > 0 && arr [ j ] > arr [ gap + j ] ; j -= gap ) { //满足条件则插入 let temp = arr [ j ] ; arr [ j ] = arr [ gap + j ] ; arr [ gap + j ] = temp ; } } } }

数据结构排序习题

风格不统一 提交于 2019-12-15 19:37:17
以关键字序列{503,087,512,061,908,170,897,275,653,426}为例,手工执行以下排序算法,写出每一趟排序结束时的关键字状态。 (1)直接插入排序 (2)希尔排序(增量序列为5,3,1) (3)快速排序 来源: CSDN 作者: mez_Blog 链接: https://blog.csdn.net/mez_Blog/article/details/103551257

希尔排序(python 实现)

拈花ヽ惹草 提交于 2019-12-12 05:40:37
""" 希尔排序 gap = 子序列之间的间距 """ def shell_sort(sort_list): n = len(sort_list) # 初始排序的gap gap = n // 2 while gap > 0: for i in range(gap, n): j = i # 根据gap来进行比较,比较完后,下标减一,继续比较,直到比较到序列头。 while j >= gap and sort_list[j-gap] > sort_list[j]: sort_list[j - gap], sort_list[j] = sort_list[j], sort_list[j-gap] j -= gap gap = gap // 2 来源: https://www.cnblogs.com/sometingintheway/p/12026812.html

十大排序算法之希尔排序

99封情书 提交于 2019-12-11 07:37:23
简介 插入排序对于大规模的乱序数组,插入排序会很慢,因为它只会交换相邻的元素,元素只能一点一点的从数组的一端移动到另一端。如果最小的元素在数组的末尾,则要将它移动到数组的开头则需要进行n-1次移动。 希尔排序改进了插入排序这一问题,它交换不相邻的元素对数组进行局部排序,并最终用插入排序将局部有序的数组进行排序。 希尔排序的思想就是使得数组中任意间隔h的元素都是有序的,这样的数组可以成为h有序数组。这里拿数组a={4,8,9,1,10,6,2,5}为例,当h为4时,会将这个数组分为h个子数组。 实例 Java 代码 public class Main { public static void main ( String [ ] args ) { int [ ] sort = { 3 , 2 , 1 , 4 , 6 , 5 , 8 , 9 , 10 , 7 } ; System . out . println ( "排序前:" ) ; printArray ( sort ) ; shellSort ( sort ) ; System . out . println ( "\n排序后:" ) ; printArray ( sort ) ; } public static void printArray ( int [ ] a ) { for ( int i = 0 ; i < a .

排序算法-希尔排序(Java)

随声附和 提交于 2019-12-07 10:18:25
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className ShellSort * @date 2019/12/4 13:05 * @package com.rao.sort * @Description 希尔排序 */ public class ShellSort { /** * 希尔排序 * @param arr:要排序的数组 */ public static void shellSort(int[] arr){ int n = arr.length; //把数组进行分组,组数为数组的长度除以2, 4, 8... 直到只能分成一组 for (int h = n/2; h > 0; h = h/2){ for (int i = h; i < n; i++){ insertI(arr, h, i); } } } /** * 插入排序 * @param arr:要排序的数组 * @param h:分组之间的间隔 * @param i:要进行插入排序的元素的下标 */ public static void insertI(int[] arr, int h, int i){ //先把要进行插入的元素保存起来 int temp = arr[i]; int k; /

【排序算法】希尔排序

泄露秘密 提交于 2019-12-06 22:03:37
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位; 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。 1. 算法步骤 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; 按增量序列个数 k,对序列进行 k 趟排序; 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 来源: https://www.cnblogs.com/sugerlato/p/11999761.html