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

沈阳集团网站建设黄页88怎么注销

沈阳集团网站建设,黄页88怎么注销,旅游网站后台管理系统,化妆品网站建设模板🥦前言: 希尔排序也称 “缩小增量排序”,它也是一种插入类排序的方法,在学习希尔排序之前我们首先了解一下直接插入排序. 一: 🚩直接插入排序 1.1 🌟排序思路 直接插入排序的基本原理是将一条记录插入到已排好的有序表中&#x…

🥦前言:

        希尔排序也称 “缩小增量排序”,它也是一种插入类排序的方法,在学习希尔排序之前我们首先了解一下直接插入排序.

一: 🚩直接插入排序

1.1 🌟排序思路

        直接插入排序的基本原理是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表,其思路就和我们摸扑克牌一样,每摸到一张牌按照大小把他插入到对应位置,这样等摸完全部的牌时,我们手里的牌就是有序的

动态图解:

        首先我们把数组的第一个元素看作有序的,将第二个元素插入到与第一个元素对应的位置,再将数组的第三个元素插入到相对于数组前两个元素对应的位置,直到最后一个元素插入到对应位置 

代码演示: (排升序)

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;//首先保存一下待插入的元素int tmp = a[end + 1];//比较的最坏情况时end=0while (end >= 0){//若待排序元素比a[end]小,则让a[end]向后移动腾位置if (tmp < a[end]){a[end + 1] = a[end];end--;}else{//由于本来数组就为有序数组,当不满足上述条件时,说明找到了待插入的位置break;}}//插入数据a[end + 1] = tmp;}
}

1.2 💬直接插入排序特点

  • 直接插入排序的时间复杂度为O(N^2),若待排序表为有序的则时间复杂度为O(N)
  • 待排序表越接近有序则时间复杂度越小
  • 空间复杂度为O(1),是一个稳定的排序算法
  • 与同为时间复杂度为O(N^2)的冒泡排序相比,若待排序数组为有序的,虽然冒泡排序不需要挪动数据,但是其时间复杂度依旧为O(N^2),所以直接插入排序在特定情况下还是优于冒泡排序的

二: 🚩希尔排序

2.1 🌟排序思路

  1. 预排序:先将数组分组,将每个组排序,目的是让整个数组相对有序
  2. 插入排序:待数组相对有序后,进行直接插入排序,这样效率比较高

图解:

假设待排序数组为[9 8 7 6 5 4 3 2 1]

1.我们将他们每隔三个坐标分为一组,假设gap=3

2.对三个数组分别进行直接插入排序,使数组整体相对有序

3.对数组整体进行插入排序


对于代码的理解我们一步一步来

首先我们先理解对红色的一组进行预排序

//希尔排序
void ShellSort(int* a, int n)
{int gap = 3;//要注意i的范围要控制到n-gap以内,因为当end大于等于n-gap时,tmp会越界             for (int i = 0; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}
}

要对红蓝绿三组都进行排序的话,直接在外层套个循环即可,我们会发现定义gap为几最后数组就会被分割为几组

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

上述代码是排完一组在排一组,其实也可以直接一次性把三组数据全部排好

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

到了这里数组就预排好了,但是我们得思考一个问题:

        由于我们排序的数组的长度都是不固定的,那直接把gap定死就是不合适的,gap越大,较大的数就能更快的排到后面,gap越小预排出来的数组就越接近有序,当gap=1时就为直接插入排序,所以gap应该随n的大小而变化,并且gap最后应该为1.

        对于希尔增量到底怎么取也没有一个最优的值刚开始有人认为gap=gap/2,但是后来有人认为这样处理预排出来数组还是不够有序,后来又提出了gap=gap/3+1 ,  (+1)是为了确保gap最终能变为1

希尔排序完整代码:

void ShellSort(int* a, int n)
{//首先将gap定为nint gap = n;/*while (gap > 1){gap = gap / 3 + 1;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){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;}}}*/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;}}
}

2.2 💬希尔排序特点

  • 希尔排序其实是对直接插入排序的优化,其效率更高
  • 当gap>1时,为预排序目的是让数组相对有序,当gap=1时,为直接插入排序,目的是让数组有序
  • 希尔排序的时间复杂度不容易计算,但是有专业人士算出希尔排序的时间按复杂度大概为O(N^1.3)
http://www.yayakq.cn/news/794113/

相关文章:

  • wordpress数据库cpu太高东莞网络优化专业乐云seo
  • 杭州网站建设源码做二手车有哪些网站有哪些手续费
  • 星沙网站建设公司深圳大梅沙
  • 沧州网站建设的技术方案代码模版 网站
  • 上饶建站公司dw网站log怎么做
  • 安徽省住房和建设厅门户网站洛阳网站建设行业
  • 重庆制作网站怎么选wordpress 条件查询数据库
  • 企业建立企业网站有哪些优势?中国上海人才市场官网
  • 永久开源的免费建站系统网站建设 做一个网站需要多少钱
  • 网站目标规划支付宝小程序定制
  • 晚上睡不着网站2021免费中小企业上市公司名单
  • 环保局网站建设申请网站 制作登录
  • 酒店网站建设协议wordpress能做外贸网站
  • 搭建网站流程做门户网站需要什么
  • 求个网站你明白的网络营销公司排行榜
  • 烟台企业网站建设用公司网站后缀做邮箱
  • 网站rp原型图怎么做买个购物网站
  • 酷站 房地产的网站设计参 案例男生做污污的网站
  • 创建小型网站的步骤东莞网络营销网络推广系统
  • 阜阳网站开发泰安网站seo
  • 南昌专业的学校网站建设公司会泽住房和城乡建设局网站
  • 上林住房和城乡建设网站网站关键词怎样优化
  • 做网站推广送什么南宁市住房和城乡建设局
  • 哪些平台可以建立网站吗网站域名解析登陆
  • 广告公司做网站郑州模板网站建设
  • pc端网站开发技术受欢迎的徐州网站建设
  • cms仿站宝安建设工程交易服务网
  • 网站建设不完整(网站内容太少)wordpress 网址优化
  • 定制网站开发商业计划书专业网站建设案例
  • 买个网站需要多少钱付费 视频 网站 怎么做