1. 对序列{15,9,7,8,20,-1,4}用希尔排序方法排序,经一趟后序列变为{15,-1,4,8,20,9,7}则该次采用的增量是:4
分析:15,9,7,8,20,-1,4,排序后,9和-1交换,即1号和5号互换,增量为5-1=4。而增量为1就是直接插入排序。
2. 对同一待排序序列分别进行折半插入排序和直接插入排序,两者直接可能的不同之处是:元素之间的比较次数。
分析:折半插入排序,是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。所以,很明显比较的次数减少了。
3. 元素的移动次数与关键字的初始排列次序无关的是:基数排序
元素的比较次数与初始序列无关是:选择排序
算法的时间复杂度与初始序列无关的是:选择排序
基数排序的效率和初始序列是否有序没有关联
比较次数和时间复杂度还是有区别的,堆排序的时间复杂度不会因为待排序序列的有序程度而改变,但是待排序序列的有序程度会影响比较次数,没看仔细。选择排序每选一个输出来数出来都要和剩余的所有数比较,这样待排序序列的有序程度不会影响比较次数。
3. 如表r有100000个元素,前99999个元素递增有序,则采用(A)方法比较次数较少。
A 折半插入排序 B 冒泡排序 C 归并排序 D基数排序
分析:元素已有序时,插入排序的时间复杂度为O(n)。
4. 将7个不同的数据进行排序,至少需要比较6次。
分析:7个有序的数据,用插入排序只需要比较6次。
5.
6.在一个元素个数为N的数组里,找到升序排在N/5位置的元素的最优算法时间复杂度是(A)
A O(N) BO(Nlog N) CO(N(log N)2) D O(N 3/2)
分析:BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。
算法步骤:
1)将n个元素每5个一组,分成n/5(上界)组。
2)取出每一组的中位数,任意排序方法,比如插入排序。
3)递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
4)用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。
5)若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k小的元素。
终止条件:n=1时,返回的即是i小元素。
分析二:利用快排,一开始将数列分为两部分,用时为n,根据n/5然后在左部分或者右部分继续分割,用时n/2,。。。。最后时间总的为n+n/2+n/4+n/8...=O(n)。(见算法导论第120页,快排的期望运行时间为O(nlgn),而用快排取第I大的数期望运行时间为O(n))
分析三:其实这个和找第K小的数是一样的?k=N/5
快排思想:找一个数,分成左右两堆(左小右大),如果左边元素个数m大于K,说明是在左边第K小的数,反之在右边。未选择的那边丢弃,剩下的重复,进行次数为a次。
第K小的数时间复杂度为O(N*loga)≈O(N),而快排为O(N*logN)原因是没有丢弃任何一边。
7.精俭排序,即一对数字不进行两次和两次以上的比较,以下是“精俭排序”的是:AB
A 插入排序 B归并排序 C 选择排序 D 堆排序
分析:这道题目的正确答案是AB,插入排序是将未排好的数据插入到已经排好序的数据之中,因此一对数据只会比较一次,归并排序是两两合并,因此一对数据也只会比较一次。
分析二:A.插入排序,前面是有序的,后面的每一个元素与前面有序的元素比较,比较过的就是有序的了,不会再比较一次,例如:
3 2 1 5 第一趟:【2,3,1,5】,2和3比较,3后移;第二趟:【1,2,3,5】,1和2,1和3比较,而2,3不会比较。
B.每次合并后,内部都是有序的,内部的元素之间不用再比较
C.选择排序,每次在后面的元素中找到最小的,找最小元素的过程是在没有排好序的那部分进行,所有肯定会比较多次;
D.堆排序:每次要调整堆,举个例子试试,很容易看出来。
总之,只要是每次操作是在排好序的那部分元素之间操作,就符合题意,否则不是。