算法课程作业5

exercise5

1.试设计比较策略:用 6 次比较在 5 个元素中找到中位数。

# 用 6 次比较在 5 个元素中找到中位数;用 7 次比较完成 5 个元素的排序。

import numpy as np

# 比较并交换数组元素位置,大的在前面
def sortBinary(index1, index2, a):   
    if a[index1] > a[index2]:
        pass
    else:
        temp = a[index1]
        a[index1] = a[index2]
        a[index2] = temp

# 比较不交换,返回大数的位置
def maxBinary(index1, index2, a):
    max = index1 if a[index1] > a[index2] else index2
    return max


def findmedian(a):
    sortBinary(0, 1, list)
    sortBinary(2, 3, list)
    x3 = maxBinary(0, 2, list)  #排除最大的一个,并前两轮保留比较位置信息
    if x3 == 0:
        sortBinary(1, 4, list)   
        sortBinary(1, 2, list)   #两轮比较后再排除一个大数,已经找出俩个大数,只需最后比较一次就可确定中位数
        return a[maxBinary(2,4,a)]
    else:
        sortBinary(3, 4, list)
        sortBinary(3, 0, list)
        return a[maxBinary(0, 4,a)]

list = np.array([1, 2, 3, 4, 5])
print(findmedian(list))


#结果:
3

2.用 7 次比较完成 5 个元素的排序。

7次比较完成5个元素的排序:

     有五个数字,[a, b, c, d, e],进行排序。以下排序均按从小到大进行排序:
  1.   将a与b进行排序,排序结果为[a’, b’],共用1次比较,累计1次比较;
    
  2.   将c与d进行排序,排序结果为[c’, d’],共用1次比较,累计2次比较;
    
  3.   将a’与c’进行比较,若a’ < c’,则a’ < c’ < d’,同时a’ < b’;否则 c’ < a’ < b’,同时c’ < d’。共用1次比较,累计3次比较。将未排入序列的数字记为x(b'或者d');
    
  4.   将e向已排序的三个元素中进行插入,最大需2次比较,累计5次比较;
    
  5.   将x将向序列中进行排序。由于已知x比序列序列中一个元素要大,所以x一定比当前序列中最左值要大,所以最多还要和三个元素进行比较,需要2次比较,累计7次比较。
    
import random

nums = random.sample(range(1, 100), 5)

print(nums)

# step 1
if nums[0] > nums[1]:
    tmp = nums[1]
    nums.remove(tmp)
    nums.insert(0, tmp)

# step 2
if nums[2] > nums[3]:
    tmp = nums[3]
    nums.remove(tmp)
    nums.insert(2, tmp)

# step 3
save_num = 0
if nums[0] < nums[2]:
    save_num = nums[1]
else:
    save_num = nums[3]
    tmp = nums[2]
    nums.remove(tmp)
    nums.insert(0, tmp)

nums.remove(save_num)

# step 4
tmp = nums[3]
nums.remove(tmp)
if tmp < nums[1]:
    if tmp < nums[0]:
        nums.insert(0, tmp)
    else:
        nums.insert(1, tmp)
else:
    if tmp < nums[2]:
        nums.insert(2, tmp)
    else:
        nums.insert(3, tmp)

# step 5
if save_num < nums[2]:
    if save_num < nums[1]:
        nums.insert(1, save_num)
    else:
        nums.insert(2, save_num)
else:
    if save_num < nums[3]:
        nums.insert(3, save_num)
    else:
        nums.insert(4, save_num)

# Last list
print "排序后", nums


#结果:
[52, 21, 86, 83, 35]
排序后 [21, 35, 52, 83, 86]

猜你喜欢

转载自blog.csdn.net/qq_33330524/article/details/85176615