软考-- 软件设计师(8)-- 查找、排序
前言
考试时间:每年5月、11月,软件设计师每年都会开考。
考试条件:三不限
考试形式: 一共两门
计算机于软件工程基本知识--120分钟--机考--选择题--75分(45及格)
软件设计--120分钟--机考--简答题(4道必做,1道二选一做)--75分(45及格)
两门都得一次性及格才算通过,一共4小时考试时间。
软件行业从事人员学习视频:https://www.bilibili.com/video/BV1Qc411G7fB?vd_source=d82c92f6c1fd8c6785c6b557a68cb7b3
推荐博客:http://t.csdnimg.cn/5VzY5
推荐bilibli博主:zst_2001
由于本人从事软件开发4年,有一定的基础,所以本系列博客笔记皆从于第一个视频记录笔记。
一、查找
二、排序
基本概念
排序:重新排列表中的元素,使表中的元素满足按关键字有序的过程。
排序分为:稳定排序 和 不稳定排序(重要),内部排序 和 外部排序(不重要)
ex:21(蓝),32,13,45,27,21(红),有以上一排数据,如果经过排序算法A排序后,21(蓝)仍然在21(红)之前,则算法A为稳定排序
,否则算法A为不稳定排序。
希尔排序:
增量d生成的规则,d1=n/2,d2=d1/2,d3=d2/2...能直接除尽则直接取,除不尽取奇数。ex:10/2=5,取5。5/2=2.5,取3,3/2=1.5取1
下图解析:
1、d1=n/2=5,增量为5,则57和28对比,57>28,则57和28互换位置。68和96对比,68<96,则不用互换。重复下去得到第二列数据。
2、d2=d1/2=2.5,取最近的奇数,的d2=3,则第二列数据中,以28开始增量为3的数据为:28、24、96、72,将其排序并且插入到相应位置,
得到数据:24、68、33、28、19、57、72、59、52、96。第二列数据中以68开始增量为3的数据为:68、19、59,将其排序并且插入到相应
位置,得到数据:24、19、33、28、59、57、72、68、52、96。第二列数据中以33开始增量为3的数据为:33、57、52,将其排序并且插入
到相应位置,得到数据:24、19、33、28、59、52、72、68、57、96。得到第三列数据。
3、d3=d2/2=1.5,取最近的奇数,的d3=1,则第三列数据以增量为1,互相比较,若 前面 > 后面 则互换位置。
快速排序:
取首元素作为枢纽pivot,其他元素和pivot对比,小于pivot的放于pivot左边,大于pivot的放于右边。一次操作后对pivot两边的数据
重复递归此操作,直到排序全部完成。
其实真正的操作是指针的互换,但是我们应试,直接理解成这样就可以了。
ex:下图中,取57作为pivot,小于57放左边,大于57的放右边。一次操作后得到[19 24 33 52 28] 57 [96 72 59 68],再分别对两边
的[19 24 33 52 28],[96 72 59 68]重复此操作,直到排序结束。
堆排序:
小顶堆:堆顶位置的数据永远都是最小的数据,且各个子树的根节点 都小于 其叶子节点;
大顶堆:堆顶位置的数据永远都是最大的数据,且各个子树的根节点 都大于 其叶子节点。
堆排序ex:
1.1:初始化建立堆;
1.2:从叶子节点的子树向上推,所以图1.2中,5、8、0中8最大,则交换5和8的位置;
1.3:从叶子节点的子树向上推,所以图1.3中,2、4、6中6最大,则交换4和6的位置;
1.4:继续推左子树,发现左子树接下来需要比较的树值为3、8、7,其中8最大,则交换3和8的位置;
1.5:经过1.4的操作后发现,左叶子节点最小子树3,5,0不满足大顶堆条件了,则需要对其重新排列,比较3、5、0,其中5最大,则交换
3和5的位置;
1.6:现在发现左子树 和 右子树都满足大顶堆条件。只有根节点不满足。比较最大子树1、8、6,其中8最大,则交换1和8的位置;
1.7:经过1.4的操作后发现,左子树1,5,7不满足大顶堆条件了,则需要对其重新排列,比较1、5、7,其中7最大,则交换
1和7的位置;
发现整个树各个子树都满足大顶堆条件,堆排序完成。
归并排序:把两个 或 多个已经**有序**的序列合并
ex:
1、合并[57 68][52 59] 和 [28 72][33 96] ,得到两个有序序列[52 57 59 68],[28 33 72 96];
2、合并[52 57 59 68]和 [28 33 72 96];
三、排序的评价指标(重点)
不稳定排序:快选希堆(快速排序,选择排序,希尔排序,堆排序)