代码编织梦想

 

1、归并排序——归并

  •  假设现在的列表分为两段有序,如何将其合成为一个有序列表
  • 这种操作称为一次归并

 归并过程描述:(前提是两段列表分别有序)

        两段有序列表进行对比,1和2进行对比选出最小的数,1出列,然后指针向后移,2和3在进行对比,2出列,指针向后移,指向5,以此类推......

# 归并排序
def merge(li, low, mid, high):
    '''
    :param li:列表[AB]
    :param low:A列表的第一个位置
    :param mid:A列表的最后一个位置,mid+1为B列表的第一个位置
    :param high:B列表的最后一个位置
    :return:
    '''
    i = low
    j = mid + 1
    ltmp = []  # 临时列表
    while i <= mid and j <= high:  # 只要左右两边都有数
        if li[i] < li[j]:
            ltmp.append(li[i])
            i = i + 1
        else:
            ltmp.append(li[j])
            j = j + 1
    # 第一部分跳出之后,肯定一部分没数了
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high + 1] = ltmp


li = [2, 4, 7, 8, 3, 6, 9, 10]
print(li)
merge(li, 0, 3, 7)
print(li)

2、归并排序——使用归并

  • 之前介绍的归并条件是两个列表分别有序,但是在实际中不会遇到这样的特殊情况,因此我们需要进行以下操作
  • 分解:将列表越分越小,直至分成一个元素
  • 终止条件:一个元素是有序的
  • 合并:将两个有序列表归并,列表越来越大
  • 过程如下图所示:

 

# 归并排序
def merge(li, low, mid, high):
    '''
    :param li:列表[AB]
    :param low:A列表的第一个位置
    :param mid:A列表的最后一个位置,mid+1为B列表的第一个位置
    :param high:B列表的最后一个位置
    :return:
    '''
    i = low
    j = mid + 1
    ltmp = []  # 临时列表
    while i <= mid and j <= high:  # 只要左右两边都有数
        if li[i] < li[j]:
            ltmp.append(li[i])
            i = i + 1
        else:
            ltmp.append(li[j])
            j = j + 1
    # 第一部分跳出之后,肯定一部分没数了
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high + 1] = ltmp


def merge_sort(li, low, high):
    '''归并排序'''
    if low < high:  # 至少有两个元素
        # 使用递归分解
        mid = (low + high) // 2
        merge_sort(li, low, mid)
        merge_sort(li, mid + 1, high)
        # 使用merge合并
        merge(li, low, mid, high)


# li = [2, 4, 7, 8, 3, 6, 9, 10]
# print(li)
# merge(li, 0, 3, 7)
# print(li)

li = list(range(100))
import random

random.shuffle(li)
print(li)
merge_sort(li, 0, len(li) - 1)
print(li)

3、归并排序算法的时间复杂度和空间复杂度

  • 时间复杂度O(nlogn)
  • 空间复杂度O(n)(递归)

4、基于前两部分的三种排序算法小结

  •  三种排序算法的时间复杂度都是O(nlogn)
  • 一般情况下,就运行时间而言
    • 快速排序<归并排序<堆排序
  • 三种排序算法的缺点:
    • 快速排序:极端情况下排序效率低
    • 归并排序:需要额外的内存开销
    • 堆排序:在快的排序算法中相对较慢

 

 5、深拷贝和浅拷贝的区别

  • 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存(分支)
  • 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”(不是分支)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42120059/article/details/130854397

python数据结构与算法(堆排序,希尔排序,归并排序)-爱代码爱编程

继续排序算法。这几天下来,对算法有了点了解,但是还是感觉到不透彻,老规矩,还是多总结多磨。 一.堆排序(Heapsort) 先吐槽下,对于非计算机专业,这个算法花了点时间去理解- -。 堆排序,百度百科一句话,“是指利用

数据结构:归并排序算法,详解,图解 -- 数据结构算法集-爱代码爱编程

归并排序算法 折半/二分查找算法冒泡排序算法插入排序算法选择排序算法快速排序算法希尔排序算法堆排序算法归并排序算法归并排序算法讲的是先分后合: 总的来说归并排序就是把原序列都拆分为单个的元素,然后从单个的元素开始进行按照大小合并到中间list中,排序完成。 这里的拆分比较容易,重点讲解合并 合并的步骤: 首先创建一个用于存放排好序的列表resul

018 python数据结构与算法:归并排序/二分查找-爱代码爱编程

排序 归并排序 归并排序是分治法的典型应用。归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路就是比较两个数组的最前面的数,谁更小就先取谁,取了后相应的指针就往后移动一位,直至其中一个数组为空,最后把另外一个数组的剩余部分复制到新数组的后面。 那么当序列的元素个数为奇数时,就有一组数组的元素会多一个。这样当

【干货总结】排序算法二:快速排序、归并排序、堆排序-爱代码爱编程

本文介绍比较快速的三种主流排序方法,平均时间复杂度均为。其中,堆排序的介绍中,默认读者已经对堆结构有了一定了解。代码同样实现原地排序,即只改变原数组,不用新数组替代。 快速排序 算法思路:快速排序也是一种分而治之的思路。首先先将数组的第一个元素视为目标元素,我们的第一个任务是将目标元素放到他在数组中“合适”的位置。“合适”的位置含义是这个位置左边的元素

python实现几种常用的排序算法(冒泡排序,快速排序,选择排序,堆排序,插入排序,希尔排序,归并排序),带注释简单通俗易懂-爱代码爱编程

1.冒泡排序算法 # 冒泡排序算法(从小到大) #方法1 def bubblesort(data): n=len(data) for i in range(0,n): for j in range(i+1,n): if data[i]>data[j]: data

排序算法(六)——归并排序算法详解及Python实现-爱代码爱编程

目录 一、简介二、算法介绍三、代码实现3.1 递归方式实现归并排序3.2 迭代方式实现归并排序排序算法系列——相关文章 一、简介 归并排序(Merging Sort)算法是一种稳定排序算法,和堆排序算法一样,都是利用完全二叉树的深度是 ⌊

python数据结构——快速掌握简单高效的堆排序heapq库堆算法-爱代码爱编程

目录 堆的定义 堆满足以下特性: 堆的存储 heapq模块 创建堆: heapq.heapify(li) heapq.heappush(li, num) heapq.heappop(li) heapq.heappushpop(li, num) heapq.heapreplace(li, num) heapq.merge(li,li2)

归并排序与归并排序的使用及归并排序与快速排序、堆排序运行时间比较_归并排序的最快运行时间-爱代码爱编程

"""归并排序""" ''' 假设现在的列表分两段有序,如何将其合成为一个有序列表:[2]578|9|[1]346 ,其中指针i指向2,j指向1,中间mid=9。这种操作称为一次归并 第1步:2和1比较,1小存入ltmp=[1],j指针移动+1; 第2步:i指向2,j指向3,2和3比较,2小,2存入列表litmp=[1,2],i指针移动+1; 第3步:i

python篇——数据结构与算法(第一部分)-爱代码爱编程

  目录 一、查找 1、顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。 2、二分查找:也叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。 二、排序 1、冒泡排序(原地排序) 2、选择排序  3、插入排序 4、快速排序