首页 > 编程语言 >[排序算法] 希尔排序 (C++)

[排序算法] 希尔排序 (C++)

时间:2022-11-19 21:23:34浏览次数:68  
标签:int 插入排序 incre C++ 希尔 增量 序列 排序

前言

本文章是建立在插入排序的基础上写的喔,如果有对插入排序还有不懂的童鞋,可以看看这里。
❤❤❤ 直接/折半插入排序 2路插入排序 ❤❤❤



希尔排序解释

希尔排序 Shell Sort 又名"缩小增量排序",是对直接插入排序更加高效的改进版本。它是由 Donald Shell 于1959年提出的一种排序算法。

希尔排序 其原理是设置一个增量incre,在原序列上每隔一个增量选取一个数据元素,将这些选取的元素构造成一个子序列

每设一个增量,我们每次会得到一组子序列 (子序列个数和当前增量相等),然后分别对这些子序列进行 直接插入排序

随着增量的减少,重复上述的操作,直到增量incre1 时,最后完成整个序列的排序。



希尔排序增量的选取

原始希尔增量

对于 希尔排序 的增量的选取,Donald Shell 一开始提出增量每次为上次的 1/2

也就是说,若数组长度为n,一开始增量为 n/2,之后每次增量都取上次的 1/2。

Knuth序列

Knuth序列:以逆向形式从1开始,通过递归表达式 interval = 3 * interval + 1 来产生,以此来得到间隔大小。

由此我们可以得到如下的增量选取方式:

具体方法是若数组长度为n,一开始增量取 n/3 向下取整 + 1。然后每次都取上次的增量的 1/3向下取整 + 1

当n足够大时,使用 Knuth序列 得到的增量选取方式,可以一定程度上提高希尔排序的效率。

(上面说的东西其实我也不知道对不对,至于为什么这样取,我也不知道哇哇哇

标签:int,插入排序,incre,C++,希尔,增量,序列,排序
From: https://www.cnblogs.com/MAKISE004/p/16906011.html

相关文章

  • 32.数据的排序
     #按某列降序排序importpandasaspdpd.set_option('display.unicode.east_asian_width',True)#规整格式df=pd.read_excel('电脑配件销售记录.xlsx')print(df......
  • C++11中using的用法学习
    转自:https://blog.csdn.net/shift_wwx/article/details/787424591.命名空间usingnamespacestd;//最常见的用法2.在子类中引入基类的成员当private继承时,可以通过usin......
  • c++友元类2
    #include<iostream>#include<cmath>usingnamespacestd;classPoint{private: doublex,y; friendclassLine;public: Point(doublei=0,doublej=0) { x=i; y=j; }......
  • c++友元类
    #include<iostream>usingnamespacestd;classmyComplex//复数类{private: doublereal,imag;public: myComplex(); myComplex(doubler,doublei); friendclassope......
  • C++初阶(封装+多态--整理的自认为很详细)
    继承概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程......
  • 排序
    title:排序date:2022-08-1811:54:40tags:-数据结构categories:-408-数据结构-代码题目:https://leetcode.cn/problems/sort-an-array/顺寻存储————......
  • Initialize all elements of an array to same value in C/C++
    UsingDesignatedInitializers//ordon'tspecifythesizeintarr[]={[0...4]=1};Usingstd::fill_nfunctionFinally,wecanusestd::fill_ninC++,......
  • go对数组对象排序
    1.根据时间对数组对象排序packagemainimport(  "fmt"  "time"  "github.com/ahmetb/go-linq/v3")typeCustomTimetime.Timefunc(aCustomTime)......
  • c++题目:切香肠
    c++题目:切香肠题目题目描述有 n 条香肠,每条香肠的长度相等。我们打算将这些香肠切开后全部分给 k 名客人,且要求每名客人获得一样多的香肠。请问最少需要切几刀?注意......
  • c++题目:吃西瓜
    吃西瓜【问题描述】老胡买了是长方体形的西瓜来犒劳大家....这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小......