Shell排序

news/2024/5/20 0:30:17 标签: 排序算法, 数据结构, 算法, 快速排序

Shell排序

  • 增量每次除以2递减的
    • 程序
    • 原理
  • 其它形式的Shell排序
    • Hibbard增量序列
    • Shell最好的代价

增量每次除以2递减的

程序

void ModInsSort(int array[], int n, int delta)
{
    for (int i = delta; i < n; i += delta)
    {
        for (int j = i; j >= delta; j -= delta)
        {
            if (array[j] < array[j - delta])
            {
                swap(array, j, j - delta);
            }
            else
            {
                break;
            }
        }
    }
}

void ShellSort(int array[], int n)
{
    //增量delta每次除以2递减
    for (int delta = n / 2; delta > 0; delta /= 2)
    {
        for (int i = 0; i < delta; i++)
        {//分别对delta个子序列进行插入排序,&array[i]传的是地址,数组总长度为n-1
            ModInsSort(&array[i], n - i, delta);
        }
    }
    //如果增量序列不能保证最后一个delta间距为1
    //可以安排下面这个扫尾性质的插入排序
    // ModInsSort(array,n,1);
}

原理

首先delta为半个数组,实现跨域数组的插入排序
在这里插入图片描述
在这里插入图片描述
第一步排序结束后,delta值除以2,即现在每次进行插入排序的个数翻倍变成4
在这里插入图片描述
在这里插入图片描述
第二步结束后,下一步就变成了全部再来一遍插入排序
在这里插入图片描述
在这里插入图片描述
但这样排序的时间代价是0(n^2),原因是每次还是会有重复出现的数进行排序,上一轮间距为2^k-1的子序列都是有那些间距为2^k的子序列组成的,上一轮循环中这些子序列已经排过序了
所以我们需要选择特殊的增量序列

其它形式的Shell排序

Hibbard增量序列

{2^k - 1, 2^(k-1) - 1, ..., 7, 3, 1}
或者采用增量除以3,Shell(3)的序列来排序
这样的序列效率都可以达到0(n^(3/2))

Shell最好的代价

2^p*3^q形式的一系列整数
1, 2, 3, 4, 6, 8, 9, 12
这样的排序效率为0(n*log2(n))


http://www.niftyadmin.cn/n/1342384.html

相关文章

Java-API:java.lang百科

ylbtech-Java-API&#xff1a;java.lang百科java.lang是提供利用 Java 编程语言进行程序设计的基础类。最重要的类是Object&#xff08;它是类层次结构的根&#xff09;和 Class&#xff08;它的实例表示正在运行的应用程序中的类&#xff09;。把基本类型的值当成一个对象来表…

vue init download template_vue.extend和vue.component的区别

vue.extend使用基础 Vue 构造器函数&#xff0c;通过原型继承&#xff0c;(返回)创建一个“子类”(构造器)。参数是一个包含组件选项的对象。const Sub function VueComponent (options) {this._init(options) } Sub.prototype Object.create(Super.prototype) Sub.prototype…

AI 积分图

积分图&#xff08;Integral Image&#xff09;&#xff0c;可以用于快速计算矩形特征。积分图每个位置(x, y)的值&#xff0c;等于原图对应位置的左上角所有像素点的值之和。因为“积分”在离散情况下就是求和&#xff0c;所以这也是积分图的命名由来。 初始状态 状态转移方程…

基数排序·静态-链式

基数排序静态基数排序实现过程代码分析链式基数排序实现过程代码分析静态基数排序 当m很大时&#xff0c;可以将一个记录的值即排序码拆分为多个部分来进行比较 例如&#xff1a;对0到9999之间的整数进行排序 1.将四位数看作是由四个排序码决定&#xff0c;即千&#xff0c;百…

oracle查询一天内的数据_基于特定数据集的Oracle、ClickHouse、ES测试报告

基于特定数据Oracle、ClickHouse、ES存储比较笔者在工作中遇到一种情况&#xff0c;有一批数据需要和其他表进行各种复杂计算、并表操作&#xff0c;输出统计值。一般情况&#xff0c;类似场景都会使用Oracle视图进行处理。但本次场景发现做关联和计算后&#xff0c;使用视图查…

2019北航面向对象课程第一单元作业(求导)个人总结

在本次博客的写作中&#xff0c;我运用IntelliJ旗舰版的Diagrams功能绘制类图&#xff0c;用MetricsReloaded插件进行代码复杂度分析。 Complexity Metrics&#xff08;复杂度分析&#xff09; 这部分我们需要使用的主要是方法和类的复杂度分析。 方法的复杂度分析主要基于循环…

排序总结·八大排序

排序总结插入排序Shell排序选择排序直接选择排序堆排序交换排序冒泡排序快速排序归并排序桶排序基数排序静态数组型链表型索引排序时间代价插入排序 void ImprovedInsertSort(int array[], int n) {int TempRecord;for (int i 1; i < n; i){TempRecord array[i];int j i…

vuex与全局变量区别_挑战全网最幽默的Vuex系列教程:第一讲 Vuex到底是什么鬼

先说两句官方已经有教程了&#xff0c;为什么还要写这个教程呢&#xff1f;说实话&#xff0c;还真不是我闲着蛋疼&#xff0c;官方的教程真的是太官方了&#xff0c;对于刚入门 Vuex 的童鞋来说&#xff0c;想必看官方的教程&#xff0c;很多地方就如同看圣经一样&#xff0c;…