第6章 排 序
本章复习建议
根据历年考查情况来看,2009~2012年本章分值分别为4分、4分、4分、4分,且均为选择题。本章知识点需要在理解的基础上进行记忆,虽然难度并不大,但是考生也不能放松警惕,特别需要注意各种排序算法的比较以及其稳定性,这些是考得比较多的知识点。
建议**复习
· 各种排序算法比较(2009年、2010年、2012年选择题)。
· 快速排序算法(2010年、2011年选择题)。
· 堆的基本性质(2011年选择题)。
· 快速排序递归次数(2010年选择题)。
· 堆的定义、插入和重新形成堆的调整方法(2009年选择题)。
历年考题分布
年份 单项选择题 综合应用题 考查内容 小计
2012年 1题×2 0题 各种排序算法比较 4分
2011年 1题×2 0题 快速排序算法、堆的基本性质 4分
2010年 1题×2 0题 快速排序递归次数、几种排序方法比较 4分
2009年 1题×2 0题 堆的定义、插入和重新形成堆的调整方法、几种排序方法比较 4分
考题大预测(仅供参考)
从历年考题来看,本章以选择题的考查为主,并且以每年两道题的数量稳定出现,在2014年的考研中可能也会延续以往的特征,望考生多加注意。
知识点提纯
1.直接插入排序
(1)算法思想。
每趟将一个待排序的元素作为关键字,按照其关键字值的大小插入到已经排好的部分序列的适当位置上,直到插入完成。
由此可以写出直接插入排序的算法代码:
void InsertSort(int R[],int n) //待排数据存在R[]中,默认为整型,个数为n
{
int i,j;
int temp;
for(i=2;i<=n;++i) //数组从下标1开始存储,**个元素有序,所以从第二个开始处理
{
temp=R[i]; //将待插入元素暂存于temp中
j=i-1;
/*这个循环完成了从待排元素之前的元素开始扫描,如果大于待排元素则后移一位。*/
while(j>=1&&temp
{
R[j+1]=R[j];
--j;
}
R[j+1]=temp; //找到插入位置,将temp中暂存的待排元素插入
}
}
(2)时间复杂度分析。
由插入排序算法代码,可以选取*内层循环里的R[j+1]=R[j];这一句作为基本操作。
1)考虑*坏的情况,即整个序列是逆序的,则内层循环中temp
2)考虑*好的情况,即整个序列已经有序,则对于内层循环中temp
综合上述两种情况,本算法平均时间复杂度为O(n2)。
(3)空间复杂度分析。
由算法代码知,算法所需的额外空间只有一个temp,因此空间复杂度为O(1)。
2.折半插入排序
(1)算法思想。
折半插入排序的基本思想和直接插入排序一样,区别在于寻找插入位置的方法不同,折半插入排序是采用折半查找法来寻找插入位置的。
折半查找法的一个基本条件是序列已经有序,这时用折半查找将快于顺序查找。从直接插入排序的流程中可以看出,每次都是在一个已经有序的序列中插入一个新的记录,所以在这个有序序列寻找插入位置,就可以用折半查找的方式来进行。"
……