用Python做50到ACM之《飞船赛》

16.飞船赛

http://acm.fzu.edu.cn/problem.php?pid=1021

思路:本质就是排序,求的是排序过程中进行交换的次数。为方便计数,这里采用冒泡排序算法

归并排序计数问题未解决,且对10^6数量级的数处理情况不理想

需要采用更高级的排序算法,有待进一步完善

import sys

def bubble(arr):
    count=0
    for i in range(1,len(arr)):
        j=i-1
        while j>=0:
            if arr[i]>arr[j]:
                arr[i],arr[j]=arr[j],arr[i]
                count+=1
                j-=1
                i-=1
            else:
                break
    print(count)

line_left=0
while True:
    read_in=sys.stdin.readline()
    if not read_in:
        break
    if line_left==0:
        line_left=int(read_in.rstrip())
        if line_left==0:
            break
        ships_speed=[]
    else:
        speed=[int(x) for x in read_in.rstrip().split(' ')][1]
        ships_speed.append(speed)
        ships_speed.reverse()
        line_left-=1
        if line_left==0:
            bubble(arr)
import random

count=0
def merge(A,start,middle,end):
    global count
    L=A[start:middle+1]
    R=A[middle+1:end+1]
    # 一旦L和R之一被返回完毕,则另一个数组剩余全部返回
    for k in range(start,end+1):
        if not L:
            A[k:end+1]=R[:]
            break
        if not R:
            A[k:end+1]=L[:]
            break
        if L[0]<=R[0]:
            A[k]=L.pop(0)
            count+=1
        else:
            A[k]=R.pop(0)
            count+=1
        
def merge_sort(A:list,start,end):
    if start<end:
        middle=(start+end)//2
        merge_sort(A,start,middle)
        merge_sort(A,middle+1,end)
        merge(A,start,middle,end)
        

#arr=[random.randint(1,100) for x in range(0,10000)]
arr=[2,1,8,3]
arr.reverse()
print(arr)
merge_sort(arr,0,len(arr)-1)
print(arr)
print(count) #正确结果应该为2
[3, 8, 1, 2]
[1, 2, 3, 8]
4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值