插入排序:每步将一个待排数按其大小插到前面已经排好的数列中,直到全部插完
插入排序主要有直接插入和希尔排序两种
直接插入:
当插入第i个记录时,R1,R2,R3,,,Ri-1均已排好,因此,将第i个记录Ri依次与R1,R2,R3,,,Ri-1进行比较,找到合适位置。
此算法简单明了,但速度较慢
如对数列57,68,59,52排序,
第一步:R1为57,已排好序,比较R2和R1,即比较68和57,68>57,无需移动位置
第二步:比较R3,即59,59分别和57、68比较,因为57<59<68,所以59插到57之后,68之前,数列变为
57,59,68,52
第三步:比较52和前面三个数,确定它的位置在57之前,所以,数列变为52,57,59,68,此时,排序完成
选择排序基本思想:每一步都从待排数列选出最小的记录,按顺序存放在已排序的记录序列后面
常见选择排序:直接选择,堆排序
直接选择:
在所有记录中选出最小的数,把它与第一个记录交换,然后在其余的记录中选出最小的数,与第2个记录交换,依次类推,直到所有记录排完为止
无论待排序列如何,在第i趟排序中选出最小数,需做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n2)。
当待排序为正序时,移动次数为0
反序时,每趟均需执行交换操作,总的移动次数取最大值3(n-1)
直接选择排序的平均时间复杂度为O(n2),是不稳定的
对于待排数列:34 56 12 23 67 98 34 67
排序过程: