谢尔排序

谢尔排序属于亚二次时间界,通过比较距离一定间隔的元素来工作,各趟比较所用的距离随时间算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

template <typename Comparable>
void shellsort(vector<Comparable>& a)
{
    for(int gap=a.size()/2;gap>0;gap/=2)
    for(int i=gap;i<a.size();i++)
    {
        Comparable tmp=a[i];        int j=i;
        for(;j>=gap&&tmp<a[j-gap];j-=gap)
            a[j]=a[j-gap];
        a[j]=tmp;
    }

}

这里使用的谢尔增量

时间: 2024-10-12 16:23:56

谢尔排序的相关文章

谢尔排序/缩减增量排序(C++)

谢尔排序/缩减增量排序(C++) 谢尔排序/缩减增量排序: 他通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.(好复杂) 看了一下实现代码,你就会发现它与插入排序好像,只不过在外面套了件马甲. 通过下面的代码可以发现在插入排序的基础上套上了增量规则,原本增量为1的变为增量为gap. 代码实现: 1 #include<iostream> 2 #include<vector> 3 4 using namespace std

谢尔排序(缩小增量排序)

核心思想:首先确定一个元素间隔数gap,然后将参加排序的序列按此间隔数从第1个元素开始依次分成若干个子序列,即分别将所有位置间隔为gap的元素视为一个子序列,在各个子序列中采用某种排序方法进行排序:然后减小间隔数,并重新将整个序列按新的间隔数分成若干个子序列,再分别对各个子序列进行排序,如此下去,直到间隔数gap=1; var arr = [38,49,65,97,76,13,27,49]; shellSort(arr);console.log(arr); var shellSort = fun

217. Contains Duplicate(C++)

217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct. 题目大意: 给定一个整数数组,

数据结构与算法题整理

未经各位前辈允许,擅自整理,还望谅解.感激不尽. ↓↓↓↓一一一2016.9.23 如何计算时间复杂度 平均查找长度详解 ↓↓↓↓一一一2016.9.15 找工作知识储备(3)---从头说12种排序算法:原理.图解.动画视频演示.代码以及笔试面试题目中的应用(该博主博客很多面试数据结构与算法方面的干货!推荐!) 找工作笔试面试那些事儿(15)---互联网公司面试的零零种种和多家经验(同为该博主,这篇讲大纲) ↓↓↓↓一一一2016.9.14 微软公司等数据结构+算法面试100题(第1-100题)

[转] js_常见算法

js模拟螺旋矩形算法 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-e

对大对象进行排序的算法

快速排序就是快速排序,谢尔排序就是谢尔排序.然而,直接应用基于这些算法的函数模板时,如果要排序的Comparable对象很大的话,有时效率会很低.问题就在于.问题就在于重新排列Comparable对象时,进行太多复制Comparable对象的工作.如果Comparable对象很大而且难于复制的话,其代价也会很高. 一般来说,这个问题的解决方案很简单:生成一个指向Comparable的指针数组,然后重新排列这些指针.一旦确定了元素应该在的位置,就可以直接将该元素放在相应的位置上,而不必进行过多的中

python中文语料分词处理,按字或者词cut_sentence

cut_sentence.py import string import jieba import jieba.posseg as psg import logging #关闭jieba日制 jieba.setLogLevel(logging.INFO) jieba.load_userdict("./corpus/keywords.txt") stopwords_path = "./corpus/stopwords.txt" stopwords = [i.strip

复试专业课知识记录(4)

2020.3.25学习记录 1.什么是P问题.NP问题和NPC问题? 时间复杂度 时间复杂度描述了当输入规模变大时,程序运行时间的变化程度,通常使用O来表示.比如单层循环的时间复杂度为O(n),也就是说程序运行的时间随着输入规模的增大线性增长,两层循环的时间复杂度为O(n2),快速排序的时间复杂度为O(nlogn),使用穷举法解决旅行商问题的时间复杂度为O(n!).时间复杂度根据变化速率的快慢可以分为两类:1.多项式级的时间复杂度,如O(1),O(n),O(na),O(logn)等:2.非多项式