排序过程示例 (用【 】表示有序序列)
待排序数据: 【25】 54 8 54 21 1 97 2 73 15n=10)
i=2: 【25 54】 8 54 21 1 97 2 73 15
i=3: 【8 25 54】 54 21 1 97 2 73 15
i=4: 【8 25 54 54】 21 1 97 2 73 15
i=5: 【8 21 25 54 54】 1 97 2 73 15
i=6: 【1 8 21 25 54 54】 97 2 73 15
i=7: 【1 8 21 25 54 54 97】 2 73 15
i=8: 【1 2 8 21 25 54 54 97】 73 15
i=9: 【1 2 8 21 25 54 54 73 97】 15
i=10: 【1 2 8 15 21 25 54 54 73 97排序结束。
算法实现。可在数组中增加元素a[0]作为关键值存储器和循环控制开关。第i趟排序,即a[i]的插入过程为:
保存a[i]→a[0]
如果a[j]<=a[0](即待排序的a[i]),则a[0]→a[j+1],完成插入;
否则,将a[j]后移一个位置:a[j]→a[j+1];;继续执行③
对于上面的数据实例,i从2依次变化到10的过程中,j值分别为。
算法分析。 稳定性:稳定。
时间复杂度:
原始数据正序,总比较次数:n-1
原始数据逆序,总比较次数:
原始数据无序,第i趟平均比较次数=,总次数为:
可见,原始数据越趋向正序,比较次数和移动次数越少。
空间复杂度:仅需一个单元a[o]
基本思想。任取一个小于n的整数s1作为增量,把所有元素分成s1个组。所有间距为s1的元素放在同一个组中。
第一组:第二组:第三组:
第s1组:先在各组内进行直接插人排序;然后,取第二个增量s2(排序示例。
算法实现。由于在分组内部使用的是直接插入排序,因此排序过程只要在直接插入排序的算法上对j的步长进行修改就可以了。
算法分析。 稳定性:不稳定。
时间复杂度:
①shell排序的执行时间依赖于增量序列。如实例所示,选择增量系列为5-2-1的比较次数《增量系列为5-3-2-1的比较次数。
②在直接插入排序中,数据越趋向于有序,比较和移动次数越少,shell排序的目的则是增加这种有序趋势。虽然看起来重复次数较多,需要多次选择增量,但开始时,增量较大,分组较多,但由于各组的数据个数少,则比较次数累计值也小,当增量趋向1时,组内数据增多,而所有数据已经基本接近有序状态,因此,shell的时间性能优于直接插入排序。
空间复杂度:仅需一个单元a[o]
交换排序的基本思想是:两两比较待排序的数据,发现两个数据的次序相反则进行交换,直到没有反序的数据为止。
排序思想。最多进行n-1趟排序,每趟排序时,从底部向上扫描,一旦发现两个相邻的元素不符合规则,则交换。我们发现,第一趟排序后,最小值在a[1],第二趟排序后,较小值在a[2],第n-1趟排序完成后,所有元素完全按顺序排列。
排序示例。待排序数据:53 33 19 53 3 63 82 20 19 39
第一趟排序:3 53 33 19 53 19 63 82 20 39
第二趟排序:3 19 53 33 19 53 20 63 82 39
第三趟排序:3 19 19 53 33 20 53 39 63 82
第四趟排序:3 19 19 20 53 33 39 53 63 82
第五趟排序:没有反序数据,排序结束。
算法分析。 稳定性:稳定。
时间复杂度:
原始数据正序,需一趟排序,比较次数n-1=o(n)
原始数据反序,需n-1趟排序,比较次数。
一般情况下,虽然不一定需要n-1趟排序,但由于每次数据位置的改变需要3次移动操作,因此,总时间复杂度高于直接插入排序。
空间复杂度:仅需一个中间变量。
改进。可以在每趟排序时,记住最后一次发生交换发生的位置,则该位置之前的记录均已有序。下一趟排序扫描到该位置结束。利用这种方式,可以减少一部分比较次数。
排序思想。在a[1..n]中任取一个数据元素作为比较的“基准”(不妨记为x),将数据区划分为左右两个部分:
a[1..i-1]和a[i+1..n],且a[1..
i-1]≤x≤a[i+1..n](1≤i≤n),当a[1..i-1]和a[i+1..
n]非空时,分别对它们进行上述的划分过程,直至所有数据元素均已排序为止。
算法实现。可以使用递归函数实现这一算法。假定待排序序列的下标范围为low~high。借用两个整型变量i、j作为指针,约定初值分别为low、high。排序过程如下:
选定基准x(不妨用a[low])
j向前扫描,直到a[j]③ i向后扫描,直到a[i]>x,交换a[i]与a[j],j-1。保证了x≤a[j..high]
继续执行②、③直到i=j。这时,x恰好在a[i]位置上。
对序列a[low..i-1]及a[i+1..high]按照上述规律继续划分,直到序列为空。
仔细分析算法,我们发现,在排序中,我们总是用基准x与另一数据交换,因此,一趟排序结束后,x就能确切定位其最终位置。
排序过程示例。
待排序数据: 67 67 14 52 29 9 90 54 87 71
x=67ij
扫描jij
交换54 67 14 52 29 9 90 67 87 71
扫描ii j
交换54 67 14 52 29 9 67 90 87 71
j=i,结束ij
第一趟排序后:54 67 14 52 29 9 [67] 90 87 71
第二趟排序后: 9 29 14 52 [54] 67 [67] 71 87 [90]
第三趟排序后:[9] 29 14 52 [54 67 67 71] 87 [90]
第四趟排序后:[9] 14 [29] 52 [54 67 67 71 87 90]
第五趟排序后:[9 14 29 52 54 67 67 71 87 90]
算法分析。 稳定性:不稳定。
时间复杂度:每趟排序所需的比较次数为待排序区间的长度-1,排序趟数越多,占用时间越多。
最坏情况:每次划分选取的基准恰好都是当前序列中的最小(或最大)值,划分的结果a[low..i-1]为空区间或a[i+1..high]是空区间,且非空区间长度达到最大值。
这种情况下,必须进行n-1趟快速排序,第i次趟去见长度为n-i+1,总的比较次数达到最大值:n(n-1)/2=o(n2)
最好情况:每次划分所取的基准都是当前序列中的“中值”,划分后的两个新区间长度大致相等。共需lgn趟快速排序,总的关键字比较次数:o(nlgn)
基准的选择决定了算法性能。经常采用选取low和high之间一个随机位置作为基准的方式改善性能。
空间复杂度:快速排序在系统内部需要一个栈来实现递归,最坏情况下为o(n),最佳情况下为o(lgn)。
选择排序的基本思想是:每一趟从待排序的数据中选出最小元素,顺序放在已排好序的数据最后,直到全部数据排序完毕。
过程模拟。算法分析。
稳定性:不稳定。
时间复杂度:o(n2)。
空间复杂度:仅需一个中间单元a[0]。
排序思想。堆排序是一种树形选择排序,在排序过程中,将a[1..n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
课程设计指导书
2014年春季学期。沈阳城市建设学院。课程设计名称单向板肋梁楼盖设计 适用年级 专业 安全12级。指导教师 张晚来 田悦。2014 年 6 月 1 日。一 基本思路 此课程设计必须是在已学 土木工程结构 有关章节的基础下进行的,所以在设计前要通读教材中 受弯构件承载力计算 和 钢筋混凝土梁板结构设计...
课程设计指导书
暖通空调 空调部分。集美大学机械工程学院。制冷空调教研室。2007年12月。暖通空调 空调部分课程设计指导书。一 题目。北京市某综合大楼空调系统设计。二 建筑资料。1.该大楼各层建筑平面图。2.建筑参数 该建筑共分为三部分 地下室为空调机房和车库。一至二层为商场,层高5米。梁高0.6米。三至六层为客...
课程设计指导书
材料成型工艺课程设计指导书。本课程设计包括以下内容 一 编制焊接工艺规程 二 编制焊接工艺卡片 三 编制装配工艺过程卡片 四 设计焊接工装夹具。一 编制焊接工艺规程 按行业标准 1 范围。2 规范性引用文件。3 焊接工艺规程内容。3.1 材料。3.1.1 母材。3.1.2 焊接材料。3.2 主要设备...