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

永安市建设局网站重庆搜索引擎seo

永安市建设局网站,重庆搜索引擎seo,学生个人网站建设模板,网站做板块地图的办法一. 排序概念及运用 排序在数据结构中是非常重要的一部分,所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 在生活中也有很多的应用,比如当我们搜索一款产品时候&#xff0…

一. 排序概念及运用

排序在数据结构中是非常重要的一部分,所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作

在生活中也有很多的应用,比如当我们搜索一款产品时候,我们可以选择按销量多少的顺序来给我们推荐产品,也可以按照价格高低来给我们推荐产品,所以排序在生活中也是很常见的。

1.1插入排序

(1)直接插入排序

上面就是一些常见的排序算法,首先我们来认识一下插入排序,插入排序又分为直接插入排序希尔排序,直接插入排序是比较好理解的,比如我们日常生活中的扑克牌游戏,当我们拿到牌的时候我们会习惯性的直接将牌按我们想要的顺序排列,如下:

那么希尔排序又是怎么回事呢? 我还是用一张清晰的思路图来向大家展示:

void InitSort(int* arr, int n)
{for (int i = 0; i < n-1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}

那么对于直接插入来说,这个算法的时间复杂度是多少呢?大家可以看我们的代码是有两层嵌套的,也就是说如果有最坏的情况发生的话,我们的时间复杂度为O(n^2),但是最好的情况是O(n)。

(2)希尔排序

我们在直接插入排序中,当数组为降序时,我们的时间复杂度会高一点,那么有没有什么办法可以得到优化呢?此时就要说我们的希尔排序了,希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap = n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。

总结下来就是第一步预排序,第二步直接插入排序

void ShellSort(int* arr, 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 = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}}

 对于希尔排序,我们直接的思路是比较好理解的,但是如果我们写成代码的话,是有点不好理解的,尤其是对于gap分组再嵌套进入循环,大家可以借助画图的方法深入理解一下。对于希尔排序的时间复杂度,希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。但是外层循环的时间复杂度可以直接给出为: O(log2 n) 或者 O(log3 n) ,即 O(log n)。总之希尔排序的效率是高于直接插入排序的。

1.2 选择排序

选择排序的基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完

(1)直接选项排序

1. 在元素集合 array[i]--array[n-1] 中选择关键码最大(小)的数据元素。
2. 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第⼀          个)元素交换。
3. 在剩余的 array[i]--array[n-2](array[i+1]--array[n-1]) 集合中,重复上述步骤,直到集合      剩余1个元素。
Swap(int* a, int* b)
{int temp;temp = *a;*a = *b;*b = temp;
}void SelectSort(int* arr, int n)
{for (int i = 0; i < n; i++){int begin = i;int mini = i;//找最小的值for (int j = i + 1; j < n; j++){if (arr[j] < arr[mini]){mini = j;}}//找到最小的值了,i和mini位置的数据进行交换Swap(&arr[i], &arr[mini]);}
}

 这一部分的算法思路还是很好理解的,我们进行了两次嵌套循环,在每一次中找到最小的值,然后将最小的值放在第一位,同时这个算法的时间复杂度跟我们的直接插入排序是一样的,最差情况是O(n^2),但是我们能不能换一个思路,我们在找最小值的情况下能不能直接找最大值,同时进行寻找,那么我们的时间效率会不会提高呢?

void SelectSort2(int* arr, int n)//优化
{int begin = 0;int end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin+1; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;}if (arr[i] < arr[mini]){mini = i;}}Swap(&arr[mini], &arr[begin]);Swap(&arr[maxi], &arr[end]);++begin;--end;}
}

 这是我们按照之后的思路写的算法,根据我的代码,我们是同时找最小值和最大值,最后在交换,但是代码出现了问题,最后并没有按我们想要的排序,那么问题到底出现在哪了呢?

 所以我们还要处理这种特殊的情况,我们就要在交换之前再加上一个if条件:

直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用。
2. 时间复杂度: O(n^2 )。
3. 空间复杂度: O(1)。

(2)堆排序

堆排序也是属于选择排序的一种,堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。在前面学习堆的时候我们也详细的讲解过堆排序的原理思路以及详细的代码展示,大家可以去看我之前写的。那么堆排序的时间复杂度是O(nlogn)。

对于今天的两大种排序算法来说,在插入排序中,希尔排序是直接插入排序的优化,效率提高了不少,在选择排序中呢,我们的直接选择排序的时间复杂度是比较高的,也就是说这个排序算法的效率是比较低的,在平时的计算中我们是不选择的,但是我们也要了解这种算法。

 

http://www.dtcms.com/wzjs/397006.html

相关文章:

  • sh域名做的好的网站最常见企业网站公司有哪些
  • 旅游网站怎么用dw做爱站网排行榜
  • 有个专门做gif的网站网络推广费用一般多少
  • 佛山营销型网站建设公司chatgpt 网址
  • 固原网站制作百度推广怎么做最好
  • 晋中市建设局网站怎么把平台推广出去
  • 网站推广与维护设计方案优化大师手机版下载安装app
  • 网站操作可行性分析昆明seo优化
  • 网站开发工资多少钱一个月seo自动刷外链工具
  • 帝国cms 网站例子百度客服人工电话24
  • 用自己的服务器建网站自己有产品怎么网络销售
  • 简述企业建网站的步骤考试培训
  • wordpress 弹图插件桂林seo顾问
  • 企业建网站多少钱自媒体平台有哪些
  • 想学习做网站百度竞价调价软件
  • 做暧昧网站中国网站排名
  • 个人网站源代码下载关键词排名软件
  • 给一个公司做网站需要什么内容大数据培训机构排名前十
  • 做销售在那个网站找怎么让客户主动找你
  • 网站建设数据录入免费网站java源码大全
  • 海西州住房建设局网站网络营销推广策划的步骤
  • 山东信达建设工程有限公司网站手机优化大师为什么扣钱
  • 合肥关键词排名推广厦门seo总部电话
  • 河北省城乡和建设厅网站南京关键词优化软件
  • 网页设计制作成品seo网站外链平台
  • 可做分析图的地图网站百度搜索
  • 移民网站建设廊坊seo建站
  • javaweb做网站的流程2020年度关键词有哪些
  • 网站关键词提交信息流优化师是干什么的
  • 怎样建立自己网站视频网站爱站网长尾词挖掘