0
点赞
收藏
分享

微信扫一扫

洛谷 P2294 [HNOI2005] 狡猾的商人

ZGtheGreat 2023-11-25 阅读 7

什么是归并排序:

归并排序是一种基于分治法的排序算法。它的基本思想是将待排序的序列分成若干个子序列,分别进行排序,然后再将已排序的子序列合并成一个有序的序列。

基本思想:

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。

具体来说,归并排序的过程如下:
1. 将待排序的序列不断地二分,直到每个子序列只包含一个元素。
2. 将相邻的子序列两两合并,合并过程中按照大小顺序将元素逐个放入临时数组中。
3. 不断重复上述步骤,直到所有子序列合并成一个有序的序列。

归并排序的时间复杂度为O(nlogn),它是一种稳定的排序算法,适合对大规模数据进行排序。

归并排序的优点包括:

1. 时间复杂度稳定:归并排序的时间复杂度为O(nlogn),在大多数情况下都能保持这个性能。
2. 稳定性:归并排序是一种稳定的排序算法,相同元素的相对位置不会改变。
3. 适合大规模数据:归并排序适合对大规模数据进行排序,因为它的时间复杂度不会随着数据规模的增加而大幅度增加。

缺点包括:

1. 需要额外空间:归并排序需要额外的空间来存储临时数组,因此空间复杂度较高。
2. 不适合小规模数据:在数据规模较小的情况下,归并排序的性能可能不如其他排序算法,因为它需要不断地进行数组分割和合并操作。
3. 实现复杂:相对于其他简单的排序算法,归并排序的实现可能比较复杂,需要理解递归和合并的过程。

代码:

def merge_sort(alist):
    n=len(alist)
    if n <= 1:
        return alist
    mid=n//2

    left_li = merge_sort(alist[:mid])
    right_li = merge_sort(alist[mid:])

    left_pointer,right_pointer=0,0
    result=[]

    while left_pointer<len(left_li) and right_pointer<len(right_li):
        if left_li[left_pointer] <= right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        else:
            result.append(right_li[right_pointer])
            right_pointer+=1
    result += left_li[left_pointer:]
    result += right_li[right_pointer:]
    return result
if __name__=="__main__":
    print(merge_sort([214,1,234,3,57,43,23,234]))
举报

相关推荐

0 条评论