排序

1、1快速排序主元
題目?jī)?nèi)容:
著名的快速排序算法里有一個(gè)經(jīng)典的劃分過(guò)程:我們通常采用某種方法取一個(gè)元素作為主元(中值),通過(guò)交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分后的N個(gè)互不相同的正整數(shù)的排列,請(qǐng)問(wèn)有多少個(gè)元素可能是劃分前選取的主元?
例如給定的排列是[1, 3, 2, 4, 5]。則:
1 的左邊沒(méi)有元素,右邊的元素都比它大,所以它可能是主元;
盡管 3 的左邊元素都比它小,但其右邊的 2 比它小,所以它不能是主元;
盡管 2 的右邊元素都比它大,但其左邊的 3 比它大,所以它不能是主元;
類似原因,4 和 5 都可能是主元。
因此,有 3 個(gè)元素可能是主元。
輸入格式:
一行數(shù)個(gè)整數(shù)的排列,由空格分隔
輸出格式:
在第 1 行中輸出有可能是主元的元素個(gè)數(shù);在第 2 行中按遞增順序輸出這些元素,其間以 1 個(gè)空格分隔,行首尾不得有多余空格。
輸入樣例:
1 3 2 4 5
輸出樣例:
3
1 4 5
代碼:

def quickSort(alist):
    output = []
    if len(alist) == 1:
        print(1)
        print(alist[0])
    for i in range(1, len(alist)-1):
        if alist[i] > max(alist[:i]) and alist[i] < min(alist[i+1:]):
            output.append(alist[i])
    if alist[0] < min(alist[1:]):
        output.append(alist[0])
    if alist[-1] > max(alist[:-2]):
        output.append(alist[-1])
    output.sort()
    print(len(output))
    print(" ".join([str(i) for i in output]))

quickSort(list(map(int, input().split())))

2、第一個(gè)壞版本
題目?jī)?nèi)容:
現(xiàn)在有同一個(gè)產(chǎn)品的N個(gè)版本,編號(hào)為從1至N的整數(shù);其中從某個(gè)版本之后所有版本均已損壞?,F(xiàn)給定一個(gè)函數(shù)isBadVersion,輸入數(shù)字N可判斷該版本是否損壞(若損壞將輸出True);請(qǐng)找出第一個(gè)損壞的版本。
注:有時(shí)isBadVersion函數(shù)運(yùn)行速度很慢,請(qǐng)注意優(yōu)化查找方式
輸入格式:
兩行
第一行為整數(shù),為產(chǎn)品號(hào)總數(shù)N
第二行為給定的判斷函數(shù),使用有效的Python表達(dá)式給出,可使用eval讀取
輸出格式:
一行數(shù)字,表示第一個(gè)損壞的版本
輸入樣例:
50
lambda n:n>=30
輸出樣例:
30
示例代碼模板:
N = int(input())
isBadVersion = eval(input())

def firstBadVersion(n):

code here

pass

print(firstBadVersion(N))

代碼:

N = int(input())
isBadVersion = eval(input())

def firstBadVersion(n):
    left = 1
    right = n
    while left < right:
        mid = (right - left) // 2
        if isBadVersion(mid):
            right = mid
        else:
            left = mid + 1
    return left

print(firstBadVersion(N))

3、插入與歸并
題目?jī)?nèi)容:
給出如下定義:
插入排序是迭代算法,逐一獲得輸入數(shù)據(jù),逐步產(chǎn)生有序的輸出序列。每步迭代中,算法從輸入序列中取出一元素,將之插入有序序列中正確的位置。如此迭代直到全部元素有序。
歸并排序進(jìn)行如下迭代操作:首先將原始序列看成 N 個(gè)只包含 1 個(gè)元素的有序子序列,然后每次迭代歸并兩個(gè)相鄰的有序子序列,直到最后只剩下 1 個(gè)有序的序列。
現(xiàn)給定原始序列和由某排序算法產(chǎn)生的中間序列,請(qǐng)你判斷該算法究竟是哪種排序算法?
輸入格式:
兩行由空格分隔的數(shù)字,其對(duì)應(yīng)長(zhǎng)度相等的列表
其中第一行代表未排序的列表,第二行是排序算法過(guò)程中某一步的中間列表
輸出格式:
首先在第 1 行中輸出Insertion Sort表示插入排序、或Merge Sort表示歸并排序;然后在第 2 行中輸出用該排序算法再迭代一輪的結(jié)果序列。題目保證每組測(cè)試的結(jié)果是唯一的。數(shù)字間以空格分隔,且行首尾不得有多余空格
輸入樣例:
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
代碼:

def check(lst1, lst2):
    flag = 0
    for i in range(len(lst2)-1):
        if lst2[i] > lst2[i+1]:
            flag = i+1
            break
    if lst1[flag:] == lst2[flag:]: #插入排序
        result = sorted(lst1[:flag+1])+lst2[flag+1:]
        return True, result
    else:#歸并排序
        cnt = 2
        result = lst2
        while result == lst2:
            sub_lst = [sorted(lst2[i:i+cnt]) for i in range(0, len(lst2), cnt)]
            result = [num for sub in sub_lst for num in sub]
            cnt *= 2
            return False, result

lst1 = [int(i) for i in input().split()]
lst2 = [int(i) for i in input().split()]
num = len(lst1)
flag, next_list = check(lst1, lst2)
if flag:
    print("Insertion Sort")
else:
    print("Merge Sort")
print(" ".join([str(i) for i in next_list]))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容