目录
一、选择填空判断题
题型一(插入排序------直接插入排序)
1、对n个元素进行直接插入排序,需要进行()趟处理。
A、n
B、n+1
C、n-1
D、2n
解析:(C)
直接插入排序是将要排序的序列按照关键字的大小插入至已排好序的子序列中,一直进行直到整个序列有序,所以对n个元素进行直接插入排序,一共插入元素n-1次,需要进行n-1趟
。
2、对5个不同的数据元素进行直接插入排序,则最多需要进行的比较次数为()。
A、8
B、10
C、15
D、25
解析:(B)
考虑最坏情况下为最多需要进行的比较次数,即序列元素呈逆序排列时最多,由于此时从前到后依次需要比较1次、2次、3次、......、n-1次,所以n(n-1)/2=(5×4)/2=10。
3、对n个元素进行直接插入排序,最好情况下的时间复杂度为(),最坏情况下的时间复杂度为()。
A、O(n),O(n^2^)
B、O(n^2^),O(n)
C、O(n),O(n)
D、O(n^2^),O(n^2^)
解析:(A)
最好情况
下,即序列元素都有序,此时只需比较元素而不需移动元素,比较次数为n-1
次,故最好时间复杂度
为O(n);而最坏情况
下,即序列元素呈逆序排列时,此时比较次数和移动次数都到达最大值,均为n(n-1)/2
,故最坏时间复杂度
为O(n^2^);考虑平均情况,总的比较次数和移动次数约为n^2^/4,故直接插入排序的时间复杂度
为O(n^2^)。
4、对n个元素进行直接插入排序,其空间复杂度为()
A、O(n)
B、O(1)
C、O(n^2^)
D、O(log~2~n)
解析:(B)
直接插入排序代码如下:
c
/*直接插入排序(由小到大)*/
void InsertSort(int r[],int n) {
int i,j,temp;
for(i=1; i<n; ++i) {
temp=r[i]; //将要插入的元素暂存在temp中
for(j>=0,j=i-1;temp<r[j];--j)
r[j+1]=r[j]; //向后挪一位
r[j+1]=temp; //找到插入位置并插入
}
}
由于直接插入排序中只使用了辅助变量,故空间复杂度为O(1)。
5、若排序的元素序列呈基本有序的前提下,选用效率最高的排序算法是()。
A、简单选择排序
B、快速排序
C、直接插入排序
D、归并排序
解析:(C)
由于序列基本有序,应该选用平均复杂度最小的排序算法。直接/折半插入排序、简单选择排序、冒泡排序都是简单型的排序算法,平均时间复杂度均为O(n^2^),但最好情况下,直接插入排序和冒泡排序可以达到O(n),折半插入排序可以达到O(nlog~2~n);堆排序、快速排序、归并排序都是改进型的排序算法,所以其时间复杂度均为O(nlog~2~n),在最好情况下可以达到O(nlog~2~n)。
题型二(插入排序------折半插入排序)
1、对n个元素进行折半插入排序,最好情况下的时间复杂度为(),最坏情况下的时间复杂度为()。
A、O(n^2^),O(nlog~2~n)
B、O(n),O(n^2^)
C、O(n^2^),O(n)
D、O(nlog~2~n),O(n^2^)
解析:(D)
折半插入排序与直接插入排序相比减少了比较元素的次数,其移动次数与直接插入排序是一样的。 先折半查找当前元素的插入位置,此时的时间复杂度为O(nlog~2~n),然后移动插入位置之后的所有元素,此时的时间复杂度为O(n^2^),故最好时间复杂度
为O(nlog~2~n);而最坏情况下,故最坏时间复杂度
为O(n^2^);考虑平均情况下,折半插入排序的时间复杂度
仍为O(n^2^)。
2、对n个元素进行折半插入排序,其空间复杂度为()
A、O(n)
B、O(1)
C、O(n^2^)
D、O(log~2~n)
解析:(B)
折半插入排序代码如下:
cpp
/*折半插入排序*/
void Binary_InsertSort(int r[],int n) {
int i,j,temp,low,high,mid;
for(i=1; i<=n; i++) {
temp=r[i]; //将要插入的元素暂存在temp中
low=0;
high=i-1; //low和high为折半查找的范围
while(low<=high) {
mid=(low+high)/2; //mid取中间点
if(r[mid]>temp) //查找左半子表
high=mid-1;
else //查找右半子表
low=mid+1;
}
for(j=i-1; j>=high+1; j--) //先后移动元素,空出位置留给插入元素
r[j+1]=r[j];
r[j+1]=temp; //找到插入位置并插入
}
}
由于折半插入排序中只使用了辅助变量,故空间复杂度与直接插入排序相同,也为O(1)。
题型三(插入排序------希尔排序)
1、对初始数据序列(8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6)进行希尔排序。若第一趟排序结果为(1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8),第二趟排序结果为(1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9),则两趟排序采用的增 量(间隔)依次是()。
A、3,1
B、3,2
C、5,2
D、5,3
解析:(D)
故两趟排序采用的增量依次为5和3。
2、希尔排序的组内排序采用的是()。
A、直接插入排序
B、折半插入排序
C、快速排序
D、归并排序
解析:(A)
希尔排序也称为缩小增量
排序,它是通过选取一定的增量来排序的,其本质还是插入排序,通过增量将序列分为几个子序列,然后对每个子序列进行直接插入排序
,当所有序列呈基本有序时,再进行一次直接插入排序即完成。
3、以下排序中,不稳定的排序算法是()。
A、冒泡排序
B、直接插入排序
C、希尔排序
D、归并排序
解析:(C)
由于分为不同子序列后,可能会出现改变其相对位置情况,所以希尔排序是不稳定的。
题型四(交换排序------冒泡排序)
1、对n个元素进行冒泡排序,最好情况下的时间复杂度为(),最坏情况下的时间复杂度为()
A、O(n^2^),O(n)
B、O(n),O(n^2^)
C、O(n),O(n)
D、O(n^2^),O(n^2^)
解析:(B)
最好情况下,即待排序结果恰好是排序后的结果,此时比较次数为n-1,移动次数和交换次数都为0,故最好时间复杂度
为O(n);而最坏情况下,即排好的序列刚好与初始序列相反,呈逆序排列,则此时需要进行n-1趟排序,第i趟排序中要进行n-i次比较,即比较次数=交换次数=n(n-1)/2,由于每次交换都会移动3次元素从而来交换元素,即移动次数为3n(n-1)/2,故最坏时间复杂度
为O(n^2^),而考虑平均情况下,故冒泡排序的时间复杂度
为O(n^2^);
2、若用冒泡排序算法对序列{10、14、26、29、41、52}从大到小排序,则需要进行()次比较。
A、3
B、10
C、15
D、25
解析:(C)
52冒泡到最前面,比较5次;41冒泡到最前面,比较4次,......,所以一共比较次数为5+4+3+2+1=15次。
3、(多选)以下算法中,每趟排序时都能确定一个元素的最终排序位置的算法有()。
A、直接插入排序
B、折半插入排序
C、希尔排序
D、冒泡排序
E、快速排序
F、简单选择排序
G、堆排序
解析:(D、F、G)
冒泡排序、简单选择排序、堆排序每趟可确定一个元素的最终位置,堆排序中每趟形成整体有序的子序列,而快速排序只是确定枢轴元素的最终位置。
题型五(交换排序------快速排序)
1、对n个元素进行快速排序,若每次划分得到的左右子区间中的元素个数相等或只差一个,则排序的时间复杂度为()。
A、O(1)
B、O(nlog~2~n)
C、O(n^2^)
D、O(n)
解析:(B)
快速排序
是对冒泡排序的一种改进算法,它又称为分区交换排序,通过多次划分操作来实现排序思想。每一趟排序中选取一个关键字作为枢轴,枢轴将待排序的序列分为两个部分,比枢轴小的元素移到其前,比枢轴大的元素移到其后,这是一趟快速排序,然后分别对两个部分按照枢轴划分规则继续进行排序,直至每个区域只有一个元素为止,最后达到整个序列有序。
当每次划分很平均时,即最好时间复杂度
为O(n^2^);而当序列原本正序或逆序时,此时性能最差,由于每次选择的都是最靠边的元素,即最坏时间复杂度
为O(nlog~2~n);故快速排序的平均时间复杂度
为O(nlog~2~n)。