当前位置: 首页 > news >正文

网站建设费1万多入什么科目山东省住房和建设网站首页

网站建设费1万多入什么科目,山东省住房和建设网站首页,做网站要学一些什么,广州建设银行保安招聘网站目录 1.希尔排序( 缩小增量排序 ) 2.动图 ​编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结: 1.希尔排序( 缩小增量排序 ) 基本思想: 1.先选定一个…

目录

1.希尔排序( 缩小增量排序 )

2.动图 ​编辑

3.代码实现

预排序实现 

子序列排列实现

单趟排序实现

对整组数进行子排序

希尔排序代码

代码测试 

 时间复杂度分析

希尔排序的特性总结:


1.希尔排序( 缩小增量排序 )

基本思想:

1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并     对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重     复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。

2.动图 

3.代码实现

思路:

预排序实现

插入排序

预排序实现 

根据当前增量,数组被分为若干子序列,这些子序列的元素在原数组中间隔着固定的增量。对每个子序列应用插入排序。

假设最初增量为5

d越大,数据挪动得越快;d越小,数据挪动得越慢。前期让d较大,可以让数据更快得移动到自己对应的位置附近,减少挪动次数。

注:一般情况下,取序列的一半作为增量,然后依次减半,直到增量为1(也可自己设置)。

 完成了一轮希尔排序,此时整个数组并不完全有序,但是已经比原始的数组更接近有序了。然后减小增量,通常是将原来的增量除以2(或者除以3+1),现在选择下一个增量为 2,按照此排序规则继续预排序即可,直到增量为1时,则为直接插入排序,此时则排序完成。

子序列排列实现

//子序列int gap;int end;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;

 这里只需要在插入排序的基础上修改一下即可。end的所加所减都为gap;

单趟排序实现

int gap;//单趟排序实现for (int i = 0; i < n - gap; i += gap){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}

 这里的 n-gap 和插入排序中的 n-1 一样是为了防止越界

对整组数进行子排序

int gap;for (int j = 0; j < gap; j++){//单趟排序实现for (int i = 0; i < n - gap; i += gap){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}

外层循环(for (int j = 0; j < gap; j++))意在对每个以gap为间隔的分组进行遍历。

 这里进行一下优化:

三层代码的循环是每一组子排序排完再进行下一组,直到排完整个数组。

下面这组代码优化后效率并没有很大的提升,只是代码更为简洁。

这组代码是齐头并进,排完第一组的前n个就排下一组了,并没有把第一组全部排完。

int gap;for (int i = 0; i < n - gap; i++){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + 3] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}

 

希尔排序代码

分析

gap越大,大的值更快调到后面,小的值更快调到前面,越不接近有序。
gap越小,大的值更慢调到后面,小的值更慢调到前面,越接近有序。
当gap为1,就是直接插入排序。
 

所以我们这里的gap值应该是在变化的,一般我们随n变化,取gap = gap/3+1,或者gap  = gap/2;

void ShellSort(int* a,int n)
{int gap = n;while (gap>1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){//子序列int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

 这里无论gap是奇数还是偶数,这里gap最终都会除以到值为1。

 gap>1时是预排序,目的让其接近有序。
gap=1时是直接插入排序,目的让其有序。
在gap=1时,已经十分接近有序了

代码测试 

 时间复杂度分析

希尔排序的时间复杂度并不固定,它依赖于所选择的间隔序列(增量序列)。直到今天,已经有多种不同的间隔序列被提出来,每种都有自己的性能特点。

《数据结构(C语言版)》--- 严蔚敏

 《数据结构-用面相对象方法与C++描述》--- 殷人昆

 因为咋们的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(N^1.25) 到  O(1.6* N^1.25) 来算。

希尔排序的特性总结:

时间复杂度:O(N²)

空间复杂度:O(1)

稳定性:不稳定

复杂性:简单



如有错误,请指正 

 

http://www.yayakq.cn/news/667939/

相关文章:

  • 网站正能量下载直接进入主页可以吗安全吗软件开发工具03173课后题
  • 网站建设设计图软件广东省石油化工建设集团公司网站
  • 团购网站开发代码百度搜索量排名
  • 网站建设百度搜索到左边的图插件 wordpress开发教程
  • 用什么网站做pathway分析网站建设怎么选公司
  • 静态网站设计怎么做广州越秀区天气预报
  • 江苏赛华建设监理有限公司网站html5网站正在建设中模板下载
  • 网站备案对应的ip地址做网站站怎么赚钱
  • 专门找事做的网站把网站传到服务器上怎么做
  • 网站建设费用 无形资产wordpress枚举用户名
  • 怎么用dw做响应式网站自己做的电影网站犯法吗
  • 做效果图的兼职网站mip网站
  • 重庆电力建设设计公司网站微信公众号平台入口官网
  • 邯郸网站建设优化排名镇江网站建设咨询
  • 遵义网站建设中心wordpress多级分类
  • 做网站现在要多少钱甘肃政务服务网
  • wordpress微信网站模板关于茶叶的网站模板免费下载
  • 做软件的中介网站有服务器做网站
  • 自己做个网站多少钱网站后台修改图片
  • 网站建设服务商推荐门户网站部署方案
  • 濮阳建站推广哪家好网站英文版怎么做
  • 深圳建设网站的公司简介静态营销网站代码
  • asp网站源码免费下载天眼通公司查询在线
  • 上传网站到二级域名网站建设 培训 南充
  • 无极网站建设质量哪些网站的网站怎么做的
  • 电子商务网站建设 试卷手机系统优化
  • 网站建设及优化 赣icp重庆建网站
  • 智慧团建信息系统网站网站制作超链接怎么做
  • 做游戏装备网站可以吗wordpress百度云对象存储
  • 自建网站需要学哪些CMS网站建设优势