IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [每日一水] 归并排序 Python实现 -> 正文阅读

[数据结构与算法][每日一水] 归并排序 Python实现

(建议先看后边的伪代码分析,然后自己写出来)


先上代码:

import numpy as np


length = 100000
array = np.arange(0, length)
np.random.shuffle(array)


def merge(array, s1, e1, s2, e2):
    array_new = array.copy()
    # 规定从小到大
    
    steps = (e1-s1+1) + (e2-s2+1)
    start = s1
    for i in range(steps):
        
        if s1 > e1:
            array_new[start+i] = array[s2]
            s2 += 1
            continue
            
        if s2 > e2:
            array_new[start+i] = array[s1]
            s1 += 1
            continue
        
        if   array[s1] >= array[s2]:
            array_new[start+i] = array[s2]
            s2 += 1
            
        elif array[s1]  < array[s2]:
            array_new[start+i] = array[s1]
            s1 += 1
    
    array[start:e2+1] = array_new[start:e2+1]
    
    return array_new
        


def mergeSort(array, start, end):
    # 规定从小到大
    
    if end-start == 1:
    	
        if array[start] > array[end]:
            array[start] += array[end]
            array[end] = array[start] - array[end]
            array[start] = array[start] - array[end]
        return array
    
    if end == start:
        return array
    
    mid   = int((start + end) / 2)
    
    mergeSort(array, start, mid)
    mergeSort(array, mid+1, end)
    
    merge(array, start, mid, mid+1, end)

print(array)    
mergeSort(array, 0, length-1)
print(array)

俺是非科班出生的菜鸡,一大把年纪了,第一次写归并排序😭😭😭😭

不过好在写出来了,算法复杂度是 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)),上课老师说,插入排序的是线性下降的,而归并排序是指数下降的,所以更快,感觉是听懂了

简单说下这个 mergeSort 的想法:

def mergeSort():
	
	% 先处理最简单的情况
	% 例如数组长度只有1或者2

	% 然后递归调用 mergeSort 先处理前一半
	% 递归调用 mergeSort 处理后一半

	% 之后 merge 函数将两部分合并起来

就是不断的递归吧,一直递归到最简单的 case

然后 merge 这里有个新手可能有的坑,就是 要用 三个指针 去合并,就是merge函数里的:
starts1, s2

卜老师的课程里叫这个为 Divide and Conquer

从最简单的 case 开始,然后逐步问题逐步边复杂,给我的感觉就像是数学归纳法

B站也有卜老师的课
https://www.bilibili.com/video/BV1MK4y1W7Gm

老师讲的很nice, 让我这菜鸟也学会了,hxdm,冲

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:18:25  更:2021-10-03 17:20:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:23:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码