当前位置: 首页 > 编程日记 > 正文

算法面试经常需要你手写的三个排序算法(Python语言)

640?wx_fmt=jpeg


作者 | 程序员小吴

来源 | 五分钟学算法(ID: CXYxiaowu)


1. 归并排序


1.1 算法步骤


  • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

  • 重复步骤 3 直到某一指针达到序列尾;

  • 将另一序列剩下的所有元素直接复制到合并序列尾。


1.2 动画视频演示



1.3 参考代码


def mergeSort(arr):
    import math
    if(len(arr)<2):
        return arr
    middle = math.floor(len(arr)/2)
    leftright = arr[0:middle], arr[middle:]
    return merge(mergeSort(left), mergeSort(right))

def merge(left,right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0));
        else:
            result.append(right.pop(0));
    while left:
        result.append(left.pop(0));
    while right:
        result.append(right.pop(0));
    return result


2. 快速排序


2.1 算法步骤


  • 从数列中挑出一个元素,称为 “基准”(pivot);

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;


2.2 动画视频演示



2.3 参考代码


def quickSort(arr, left=None, right=None):
    left = 0 if not isinstance(left,(int, float)) else left
    right = len(arr)-1 if not isinstance(right,(int, float)) else right
    if left < right:
        partitionIndex = partition(arr, leftright)
        quickSort(arr, left, partitionIndex-1)
        quickSort(arr, partitionIndex+1right)
    return arr

def partition(arr, leftright):
    pivot = left
    index = pivot + 1
    i = index
    while  i <= right:
        if arr[i] < arr[pivot]:
            swap(arr, i, index)
            index += 1
        i += 1
    swap(arr,pivot,index - 1)
    return index - 1

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]


3. 堆排序

3.1 算法步骤

  • 创建一个堆 H[0……n-1];

  • 把堆首(最大值)和堆尾互换;

  • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

  • 重复步骤 2,直到堆的尺寸为 1。


3.2 动画视频演示



3.3 参考代码


def buildMaxHeap(arr):
    import math
    for i in range(math.floor(len(arr)/2),-1,-1):
        heapify(arr,i)

def heapify(arr, i):
    left = 2*i+1
    right = 2*i+2
    largest = i
    if left < arrLen and arr[left] > arr[largest]:
        largest = left
    if right < arrLen and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        swap(arr, i, largest)
        heapify(arr, largest)

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]

def heapSort(arr):
    global arrLen
    arrLen = len(arr)
    buildMaxHeap(arr)
    for i in range(len(arr)-1,0,-1):
        swap(arr,0,i)
        arrLen -=1
        heapify(arr, 0)
    return arr


(本文为 AI科技大本营转载文章,转载请联系原作者)

在线分享会

3月21日晚8点

近年来,聊天机器人技术及产品得到了快速的发展,本课程将全面阐述聊天机器人的技术框架及工程实现细节,并对于聊天机器人的下一代范式:虚拟生命,进行了详细的剖析,同时,聚焦知识图谱在实现认知智能过程中的重要作用,给出了知识图谱的落地实践。


640?wx_fmt=png

推荐阅读:

  • Pig变飞机?AI为什么这么蠢 | Adversarial Attack

  • 3.15曝光:40亿AI骚扰电话和11家合谋者

  • 如何从零开始用PyTorch实现Chatbot?(附完整代码)

  • 杨超越第一,Python第二

  • 麦克阿瑟奖得主Dawn Song:区块链能保密和保护隐私?图样图森破!

  • 315 后,等待失业的程序员

  • 大数据背后的无奈与焦虑:“128元连衣裙”划分矮穷挫与白富美?

  • 京东强推 995 工作制,中国式变态加班何时休?

  • 教训!学 Python 没找对路到底有多惨?


640?wx_fmt=png

❤点击“阅读原文”,查看历史精彩文章。

相关文章:

【linux】Valgrind工具集详解(十三):DRD(线程错误检测器)

一、概述 多线程编程需要注意的问题: 数据竞争;锁竞争;POSIX线程API使用不当;死锁; 二、使用 1、例子main.c源码 #include <stdio.h> #include <pthread.h> #include <sys/types.h> #include <unistd.h>

前段技术学习网站

1. 七天学会nodejs http://nqdeng.github.io/7-days-nodejs/ 2. Web 常用UI库 kissy https://www.oschina.net/p/kissy 3. 通用 WEB 框架 Webx https://www.oschina.net/p/webx 转载于:https://www.cnblogs.com/mengjianzhou/p/8610793.html

性能测试分析之带宽瓶颈的疑惑

第一部分&#xff0c; 测试执行 先看一图&#xff0c;再看下文 这个当然就是压力过程中带宽的使用率了&#xff0c;我们的带宽是1Gbps的&#xff0c;合计传输速率为128MB/s&#xff0c;也正因为这个就让我越来越疑惑了&#xff0c;不过通过压力过程中的各项数据我又不得不相信。…

心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现

作者 | 知凡&#xff0c;个人公众号&#xff1a;林木蔚然读书会&#xff08;ID:EspressoOcean&#xff09;&#xff0c;知乎ID&#xff1a;Uno Whoiam本文授权转载自知乎本文结构简单扫盲什么是去马赛克什么是超分辨率《Deep Residual Network for Joint Demosaicing and Super…

【linux】Valgrind工具集详解(十四):Cachegrind(缓存和分支预测分析器)

一、概述 Cachegrind,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。 Cachegrind模拟程…

使用mvc框架搭建跟人站点

1、使用工具 vs 、iis 2、新建一个ASP.net mvc 项目。并写好必要的代码 3、解决方案管理器&#xff0c;项目右键、发布 4、 创建配置文件 弹出网站发布设置面板&#xff0c;点击自定义,创建新的发布配置文件&#xff1a; 输入你自己定义的配置文件名&#xff08;这里随便输入&…

GitHub上7000+ Star的Python常用代码合集

作者 | 二胖并不胖来源 | 大数据前沿&#xff08;ID:bigdataqianyan&#xff09;今天二胖给大家介绍一个由一个国外小哥用好几年时间维护的Python代码合集。简单来说就是&#xff0c;这个程序员小哥在几年前开始保存自己写过的Python代码&#xff0c;同时把一些自己比较常用的代…

MIS通用管理组件_通用管理组件V2.1.0发布

MIS通用管理组件是一个基于.NET4.0的MIS微型框架&#xff0c;实现单点登录&#xff0c;MIS类管理系统集群化管理配置&#xff0c;操作权限细化&#xff0c;数据集权限逐级授权&#xff1b;提供C/S代码生成器&#xff0c;丰富的类库&#xff1b;提供全部相关的源代码&#xff0c…

python 十大经典排序算法

排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔排序、选择排序…

【linux】Valgrind工具集详解(十五):Callgrind(性能分析图)

一、概述 1、Callgrind Callgrind用于记录程序中函数之间的调用历史信息,对程序性能分析。默认情况下,收集的数据包括执行的指令数,它们与源码行的关系,函数之间的调用者、被调用者关系以及此类调用的数量。可选项是,对高速缓存模拟和分支预测(类似于Cachegrind)。 2…

WCF服务重构实录(上)

项目需求 之前的项目中采用了WCF&#xff0c;绑定模式选择的是netTcpBinding&#xff0c;宿主选择了控制台方式&#xff0c;主要考虑两方面优点&#xff1a; 方便管理宿主的生命周期提升服务性能但是在实际的开发过程中产生了许多问题&#xff0c;比如&#xff1a; 调试项目时必…

【Qt】QTest:编译Qt单元测试程序

一、使用方法 1、测试程序源码 TestQString.pro QT += testlib QT -= gui TARGET = tst_TestQStringTest CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += tst_TestQStringTest.cpp DEFINES += SRCDIR=\\\"$$PWD/\\\"tst_Test…

1/10个iPhone Xs = 英伟达最便宜AI计算机,这是唯一的“核弹”?

整理 | 一一、阿司匹林出品 | AI科技大本营&#xff08;ID:rgznai 100&#xff09;北京时间 3 月 19 日 8 点左右&#xff0c;在美国加州圣何塞的圣何塞大学活动中心&#xff0c;第十届 GTC 大会的主会结束。与往年相比&#xff0c;尽管 99 美元的 AI 计算机备受关注&#xff0…

Python链接MySQL

本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用。 PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库&#xff0c;Python2中则使用mysqldb。 Django中也可以使用PyMySQL连接MySQL数据库。 PyMySQL安装 使用pycharm安装PyMySQL 点击File-->右…

利用sendEmail-v1.55转发邮件

设置&#xff1a; /sendEmail-v1.55/sendEmail -f testtest.com -t 532126277qq.com -s s.test.com -xu testtest.com -xp 123456789 -a 文件的路径 -u 主题 -m 内容转载于:https://blog.51cto.com/holy2010/537968

【Git】git系统学习(一):常用指令

1、配置工具 $ git config --global user.name "[name]"设置用户名 $ git config --global user.email "[email address]"设置邮箱 $ git config --global color.ui auto自动配置命令行的输出颜色 $ git config --global color.ui true全部打开颜色配置…

腾讯裁撤中层干部,拥抱年轻人

据 36Kr 最新报道&#xff0c;数名消息人士证实&#xff0c;2018 年 12 月内部员工大会后&#xff0c;腾讯开始裁撤一批中层干部。整个腾讯大概有两百多名中干&#xff0c;此轮调整比例约为10%&#xff0c;有战略发展部的腾讯员工认为&#xff0c;实际甚至超过了这个比例。截止…

cmder里ls、pwd、自定义的alias等一系列命令都无法使用

win10下cmder很多命令history pwd无法使用&#xff0c;ls字体也没有颜色显示&#xff0c;其根本原因是win10下cmd控制台版本问题&#xff0c;切换回老版本就OK了 转载于:https://www.cnblogs.com/hdk1993/p/8620799.html

文件操作01 - 零基础入门学习C语言60

第十一章&#xff1a;文件操作01 让编程改变世界 Change the world by program C文件概述 所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称&#xff0c;叫做文件名。实际上在前面的各章中我们已经多次使用了文件&#xff0c;例如源程序文件、目标文件、可执…

iPad mini时隔四年更新,搭载A12芯片,起售价2999

整理 | 非主流出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;距离苹果的春季发布还有一周&#xff0c;但就在昨天&#xff0c;苹果毫无征兆地给广大果粉来了一场预热。3 月 18 日下午&#xff0c;苹果官网进行更新&#xff0c;悄悄地推出了两款新品…

【Qt】通过QtCreator源码学习Qt(一):pro文件

1、学习目的 学习pro文件的语法规则,这在跨平台项目中会经常用到。和条件编译相似,在pro中可以根据平台选择不同的编译模块、文件,还可以向源码中传递变量等。 2、学习方法 通过学习QtCreator源码中的pro文件,来掌握pro文件语法规则,下面以qtcreator.pro文件为例,先看…

TCP和UDP相关记录

有关于计算机网络的知识&#xff0c;准确来说我也忘得差不多了&#xff0c;现在要开始找实习了。努力从新学一下&#xff0c;记录在这里以防丢失。 --------------------------------------------------------- 首先对于网络层次有很多种分法。大致有7层结构、5层结构、4层结构…

win2003服务器iis6.0环境下php5.3.2安装配置

IIS6PHP5.3.2配置&#xff1a; 在windows下使用ApachePHP的&#xff0c;请选择VC6版本&#xff1b; windows下使用IISPHP的&#xff0c;请选择VC9版本 首先要知道的是&#xff0c;那个服务器平台对应PHP那个版本&#xff1a; 1、在windows下使用ApachePHP的&#xff0c;请选择…

李飞飞宣布成立斯坦福“以人为本AI研究院”

本位首发于公众号极客公园&#xff08;ID&#xff1a;GeekPark&#xff09;作者 | 沈知涵、biu编辑 | 宋德胜AI 不是要取代我们&#xff0c;而是让我们做得更好。这一次&#xff0c;台上的李飞飞不是 Google Cloud 的首席科学家&#xff0c;也不是斯坦福人工实验室&#xff08;…

【Qt】菜单栏、工具栏、状态栏、右键菜单的实现

在QMainWidget基础上实现菜单栏、工具栏、状态栏、右键菜单。 头文件: #ifndef GWDEMO_H #define GWDEMO_H#include <QMainWindow> #include <QMenu> #include

云计算公司Zuora提交IPO申请 预计募资1亿美元

2019独角兽企业重金招聘Python工程师标准>>> 总部位于硅谷的云计算公司 Zuora 周五向美国证券交易委员会&#xff08;SEC&#xff09;提交招股说明书&#xff0c;计划通过首次公开募股&#xff08;IPO&#xff09;募集 1 亿美元资金。 Zuora 已发布针对云计算提供商…

浅谈“闭包”,什么才是“闭包”思想!—— javascript

先看一个简单小案例&#xff1a;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME"Generator" CONTENT""> <META NAME"…

Debug神经网络的五项基本原则

整理 | 琥珀出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;很多情况下&#xff0c;研究人员会遇到一个问题&#xff1a;使用机器学习框架实现的神经网络可能与理论模型相去甚远。验证这款模型是否可靠&#xff0c;直接方式就是不断修正和调参。例如…

iOS获取手机型号

2019独角兽企业重金招聘Python工程师标准>>> //不同iPhone设备屏幕比例 iPhone5&#xff0c;4寸&#xff0c;比例16&#xff1a;9 iPhone5c&#xff0c;4寸&#xff0c;比例16&#xff1a;9 iPhone5s&#xff0c;4寸&#xff0c;比例16&#xff1a;9 iPhone6&#x…

【Qt】通过QtCreator源码学习Qt(二):跨平台编程

1、Qt对当前平台的判断 在qsystemdetection.h中根据宏定义来判断当前的操作系统,常用的操作系统如下: Q_OS_WIN、Q_OS_LINUX、Q_OS_MAC、Q_OS_UNIX qsystemdetection.h源码如下 #ifndef QGLOBAL_H # include <QtCore/qglobal.h> #endif#ifndef QSYSTEMDETECTION_H