排序算法学习(6)

来源:互联网 发布:推荐个淘宝卖烟的店铺 编辑:程序博客网 时间:2024/06/01 10:30

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. 快速排序的平均时间为T=knlnn,其中n为待排序序列中记录的个数,k为某个常数,经验证明,在所有同数量级的此类(先进的)排序方法中,快速排序的常数因子k最小。因此,就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法。

 

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.堆排序:每次要调整堆,举个例子试试,很容易看出来。

总之,只要是每次操作是在排好序的那部分元素之间操作,就符合题意,否则不是。

原创粉丝点击