《数据结构与算法分析python版》第七周编程作业

《数据结构与算法分析python版》第七周编程作业

1、快速排序主元

题目内容:
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元(中值),通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元

例如给定的排列是[1, 3, 2, 4, 5]。则:

1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;

类似原因,4 和 5 都可能是主元。

因此,有 3 个元素可能是主元。
输入格式:
一行数个整数的排列,由空格分隔
输出格式:
在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。
输入样例
1 3 2 4 5
输出样例:
3

1 4 5
脚本:

def mainelem(num_str):
    num_lst = num_str.split(" ")
    num_lst = list(map(int,num_lst))
    n = len(num_lst)
    mainelem_str = ""
    count = 0
    for i in range(0,n):
        notmainelem = False
        for j in range(0,i+1):
            if num_lst[j] > num_lst[i]:
                notmainelem = True
                break
        for k in range(i,n):
            if num_lst[k] < num_lst[i]:
                notmainelem = True
                break
        if notmainelem == False:
            mainelem_str = mainelem_str +" "+str(num_lst[i])
            count = count +1        
    mainelem_str = mainelem_str[1:]     
    print(count)
    print(mainelem_str)
mainelem(input())

2、第一个坏版本

题目内容:
现在有同一个产品的N个版本,编号为从1至N的整数;其中从某个版本之后所有版本均已损坏。现给定一个函数isBadVersion,输入数字N可判断该版本是否损坏(若损坏将输出True);请找出第一个损坏的版本
注:有时isBadVersion函数运行速度很慢,请注意优化查找方式

输入格式:
两行

第一行为整数,为产品号总数N

第二行为给定的判断函数,使用有效的Python表达式给出,可使用eval读取
输出格式:
一行数字,表示第一个损坏的版本
输入样例:
50
lambda n:n>=30
输出样例:
30

方法一:直接暴力查找,但是根据上面的注意,一般该方法是需要优化的。

def firstBadVersion(n):
   for i in range(1,n+1):
       if(isBadVersion(i)):
           return i
 
N = int(input())
isBadVersion = eval(input())
print(firstBadVersion(N))

方法二:二分法查找

def binarySearch(first,last):
    firstbad = None
    GoOn = True
    mid = (first+last)//2
    if last-first ==1:
        return last
    if (isBadVersion(mid)):
        while GoOn:
            if (isBadVersion(mid)):
                mid = mid -1
            else:
                GoOn = False         
        return mid +1  
    else:
        #firstbad = binarySearch(first,mid)
		#加上面这一步主要考虑的是lambda n:50>n>30这样的情况,但是在这种情况下二分法的优势就没有了。不过看题目的意思,应该是不含这种情况的。
        firstbad = binarySearch(mid,last)
    return firstbad
N = int(input())
first = 1
last = N

isBadVersion = eval(input())
print(binarySearch(first,last))


3、插入与归并

题目内容:
给出如下定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:
两行由空格分隔的数字,其对应长度相等的列表

其中第一行代表未排序的列表,第二行是排序算法过程中某一步的中间列表

输出格式
首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格

输入样例:
3 1 2 8 7 5 9 4 0 6

1 3 2 8 5 7 4 9 0 6

输出样例:
Merge Sort

1 2 3 8 4 5 7 9 0 6

输入样例2:

3 1 2 8 7 5 9 4 6 0

1 2 3 7 8 5 9 4 6 0

输出样例2:

Insertion Sort

1 2 3 5 7 8 9 4 6 0

# -*- coding: utf-8 -*-
"""
Created on Fri May  1 12:11:20 2020

@author: dulow
"""
def whichSort(rawlst,midlst):
    i = 0
    n = len(rawlst)
    isInsertion = True
    markpoint = 0

    while isInsertion and i < n-1:
        if midlst[i] <= midlst[i+1]:
            i = i +1
            markpoint = i #最后一个符合排序的位置
        else:
            break
    if rawlst[i+1:] != midlst[i+1:]:
        isInsertion = False

    if isInsertion == True:
         print("Insertion Sort")
         InsertionSort(midlst,markpoint)
    else:
         print("Merge Sort")
         MergeSort(midlst)

def InsertionSort(lst,markpoint):
    nextlst = []
    for i in range(0,markpoint+1):
        if lst[markpoint+1] < lst[i]:
            nextlst = lst[0:i]
            nextlst.append(lst.pop(markpoint+1))
            nextlst.extend(lst[i:])
    print(" ".join(str(i) for i in nextlst))
        
def MergeSort(lst):
    nextlst = lst
    span = 2
    while nextlst == lst: 
            sub_lst = [sorted(lst[i:i+span]) for i in range(0,len(lst),span)]
            nextlst = [num for sub in sub_lst for num in sub]
            span *= 2
    print(" ".join(str(i) for i in nextlst))
            
        
    
rawlst = [int(i) for i in input().split()]
midlst = [int(i) for i in input().split()]          
whichSort(rawlst,midlst)    
        

你可能感兴趣的:(《数据结构与算法分析python版》第七周编程作业)