各种排序的说明:
- 直接插入排序:是数据越有序越快,(用第2个值来跟第1个值进行比较,如果小于它的值,则插入到前面;大于它的值,则插入在它后面。)最快时间复杂度可达到O(n) ,平均时间复杂度是O(n2) (稳定)
- 折半排序:比较次数是固定的,若需要查找比较次数,则画一颗二叉判定树来计算比较次数;二分查找的过程可以用一棵二叉树来描述,该二叉树称为二叉判定树。在有序表上进行二分查找时的查找长度不超过二叉判定树的高度1+log2n。
- 希尔排序:(不稳定)
- 冒泡排序:第一趟排序是将序列中最大的关键字放在最后,第二趟排序是将第二大的关键字放在倒数第二个位置…时间复杂度最好O(n),最坏O(n2)(稳定)
- 快速排序:越有序越慢,它要从后到前遍历找比基准小的,最坏时间复杂度达到O(n),是平均查找长度最小的排序,空间复杂度为O(nlog2n),是性能最好的排序算法 (不稳定)
- 简单(直接)选择排序:最好最坏时间复杂度都是O(n2),选择排序关键字比较的次数与记录的初始排列次序无关。(不稳定)
- 简单选择排序:从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端 (不稳定)
- 堆排序:最好最坏时间复杂度一样O(nlog2n)。(不稳定)
- 归并排序:固定O(nlog2n),有序只是减少了元素交换次数。最好最坏时间复杂度一样。 (稳定)
- 总结1:稳定排序:直接插入排序,冒泡排序,折半插入排序,归并排序,基数排序是稳定的;其他排序都是不稳定的。
- 总结2:空间复杂度,快速排序为O(log2n),归并排序为O(n),其他排序空间负责度都为O(1)。
- 选择排序在最好、最坏、平均情况下的时间性能均为O(n2),归并排序在最好、最坏、平均情况下的时间性能均为O(nlog2n)。
- 选择排序和归并排序的比较次数与待排序记录的初始状态无关
各种排序比较次数:
插入 排序 最少n-1 最多n(n-1)/2
冒泡 排序 最少n-1 最多n(n-1)/2
选择 排序 最少最多为n(n-1)/2
快速 排序 最少nlog2n - 最多N2
归并 排序 nlog2n – (2N-1)logN
一、例如:关键字(45 80 48 40 22 78),请分别给出第4趟简单选择排序和直接插入排序的结果。
1.简单选择排序:
(1)从待排序的元素中选出最小的元素和第一个值进行位置交换。
(2)然后选出值为第2小的元素和第2个值进行交换。
(3)再选出值为第3小的元素和第3个值进行交换。
(3)依此类推,直到交换完毕。
例1用简单选择排序,求出第4趟的结果
第一趟:22 80 48 40 45 78
第二趟:22 40 48 80 45 78
第三趟:22 40 45 80 48 78
第四趟:22 40 45 48 80 78
第五趟:22 40 45 48 78 80
例2.[简单选择排序另一种情况]
设有一组初始关键字序列为(24,35,12,27,18,26),则第3趟简单选择排序结束后的结果的是
第一趟:12,35,24,27,18,26
说明:12最小 12和第一个数24交换位置
第二趟:12,18,24,27,35,26
说明:18最小 18和除去12的序列以外的第一个数35交换位置
第三趟:12,18,24,27,35,26
说明:24最小 24和除去12和18以外的第一个数交换位置,发现是自己本身 不用进行交换,输出序列。
例3.设一组初始记录关键字序列为(49,38,65,97,76,13,27,50),则第4趟直接选择排序结束后的结果为
第一趟:13 38 65 97 76 49 27 50
第二趟:13 27 65 97 76 49 38 50
第三趟:13 27 38 97 76 49 65 50
第四趟:13 27 38 49 76 97 65 50
第五趟:13 27 38 49 50 97 65 76
第六趟:13 27 38 49 50 65 97 76
第七趟:13 27 38 49 50 65 76 97
3、直接插入排序:
(1)先保留第一个关键字
(2)用第2个值来跟第1个值进行比较,如果小于它的值,则插入到前面;大于它的值,则插入在它后面。
(3)用第3个值来跟第2个值及前面元素进行比较,如果小于它的值,则插入到前面;大于它的值,则插入在它后面。
(4)注意:插入排序是从第2个元素开始依次向前比较(第一个不用比),到最后一个元素。
所以最多经过_n-1__趟排序可以完成排序
(5)依此类推,直到比较插入完毕。
例1:设有一组初始关键字序列为(45 80 48 40 22 78)
·用直接插入排序,求出第4趟的结果
第一趟:[45]
第二趟:[45 80]
第三趟:[45 48 80]
第四趟:[40 45 48 80] 22 78
第五趟:[22 40 45 48 80]
第六趟:[22 40 45 48 78 80]
例2:设有一组初始关键字序列为(24,35,12,27,18,26),则第3趟直接插入排序结束后的结果的是
第一趟:[24]
第二趟:[24 35]
第三趟:[12 24 35 27 18 26]
第四趟:[12 24 27 35 18 26]
第五趟:[12 18 24 27 35 26]
第六趟:[12 18 24 26 27 35]
二、快速排序(交换排序)
1.已知序列(10,18,4,3,6,12,1,9,18_,8)请用快速排序写出每一趟排序的结果。
快速排序:
这里要注意的是,如果low或high没有将元素进行移动的话,则low(high)继续指向下一个元素,而不是交替指针。
·已知关键字序列为{66,82,25,51,98,108},利用快速排序方法,以第一个元素为基准得到的一趟
排序结果为:
2.已知序列(10,18,4,3,6,12,1,9,-18-,8)请用快速排序写出每一趟排序的结果(10分)。
解题思路:
首先选择序列中第一个10为基准值。
第一次把比10小的值全部移动到左子区,比10大的值移到右子区
第二次是,后面写。
第三是,后面再来写。
快速排序步骤:
第一趟:(8,9,4,3,6,1),10,(12,18,18)
第二趟:(1,6,4,3),8,(9),10,12,(18,18)
第三趟:1,(3,4,6),8,9,10,12,18,(18)
第四趟:1,3,(4,6),8,9,10,12,18,18
第五趟:1,3, 4,6,8,9,10,12,18,18
三、堆排序。
四、折半排序(插入排序)
1.首先令low指针指向序列中第一个元素,high指向序列中最后一个元素。
2.然后指针mid = [(low+high)]/2 指向的位置, 若是为小数,则向下取整。
3.如果要查找的值小于mid.key的值,high指针指向mid-1位置;
4.如果要查找的值大于mid.key的值,low指针指向mid+1位置;
例1:设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度。
答:对于含有n个数据元素的查找表,查找成功的平均查找长度为:
ASL=∑PiCi (i=1,2,3,…,n),可以简单以数学上的期望来这么理解。其中:Pi
为查找表中第i个数据元素的概率,Ci为找到第i个数据元素时已经比较过的次数。
序列(15,17,18,22,35,51,60)
那么对数字15研究下:使用二分法找到15要经过3次比较
同理根据对称18,35,60肯定也是要比较3次,此时为3 * 4;
同理得到:查找到17,51分别需要比较2次,此时2 * 2;
查找22当然只要1次就行
ASL=(1 * 1+2 * 2+3 * 4)/7=17/7=2.42(次)
例2:数据结构有一个长度为11的有序表,按二分查找法对该表进行查找,在表内个元素等概率情况下,查找成功所需___次?
**解释:**其实只需要画一棵具有11个结点的完全二叉树,然后用每层的结点个数 * 从根出发路径上的结点数。
(1 * 1+2 * 2+3 * 4 + 4 * 4)/11 = 33/11 = 3(次)
五、希尔排序(插入排序)
设一组初始记录关键字序列为(50,40,95,20,15,70,60,45),则以增量d=4的一趟希尔排序结束后前4条记录关键字为。
若以4为增量,在序列中,[50,15]是一组,[40,70]是一组,[95,60]是一组,[20,45]是一组
经过组内排序后变为:[15,50],[40,70],[60,95],[20,45],
于是,前4条记录为15,40,60,20。