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

手撕代码之七大常用排序算法 | 附完整代码

640?wx_fmt=gif点击上方↑↑↑蓝字关注我们~

640?wx_fmt=png

2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑


0.导语


本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法:

  • 直接插入排序

  • 冒泡排序

  • 选择排序

  • 快速排序

  • 希尔排序

  • 堆排序

  • 归并排序


1.直接插入排序


【算法思想】


每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。


【代码实现】


# 直接插入排序
def insert_sort(arr):
    length = len(arr)
    for i in range(length):
        k = i
        for j in range(k,0,-1):
            if arr[j]<arr[j-1]:
                t = arr[j]
                arr[j]=arr[j-1]
                arr[j-1]=t
arr = [4,3,0,-1]
insert_sort(arr)
print(arr)


2.冒泡排序


【算法思想】


对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。


【代码实现】


# 冒泡排序
def bubbleSort(arr):
    length = len(arr)
    for i in range(length-1):
        flag = True
        for j in range(length-i-1):
            if arr[j]>arr[j+1]:
                t = arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t
                flag = False
        if flag:
            break
arr = [6,-2,0,9]
bubbleSort(arr)
print(arr)


【算法思想】


每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。


【代码实现】


def selectSort(arr):
    length = len(arr)
    for i in range(length-1):
        min = i
        for j in range(i+1,length):
            if arr[min]>arr[j]:
                min=j
        if min!=i:
            t = arr[i]
            arr[i]=arr[min]
            arr[min]=t
arr = [6,-2,0,9]
selectSort(arr)
print(arr)


4.快速排序


【算法思想】


快速排序思想----分治法。

  • 先从数列中取出一个数作为基准数。

  • 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

  • 再对左右区间重复第二步,直到各区间只有一个数。

每次划分得到,枢椎的左边比它小,右边比它大。


【代码实现】


def quickSort(arr,left,right):
    # 递归终止条件
    if left>right:
        return
    pivot = arr[left]
    i = left
    j = right
    while i<j:
        while i<j and arr[j]>=pivot:
            j-=1
        while i<j and arr[i]<=pivot:
            i+=1
        if i<j:
            t = arr[i]
            arr[i] = arr[j]
            arr[j] = t
    # 放入枢椎
    arr[left] = arr[i]
    arr[i]=pivot
    # 递归调用左区域
    quickSort(arr,left,i-1)
    # 递归调用右区域
    quickSort(arr,i+1,right)

arr = [6,-2,0,9]
quickSort(arr,0,len(arr)-1)
print(arr)


5.希尔排序


【算法思想】


该算法也被称为:缩小增量排序。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。


【代码实现】


# 希尔排序
def shellSort(arr):
    length =  len(arr)
    # 设置初始增量
    gap = length//2
    while gap>0:
        # 从第gap个元素,逐个对其所在组进行直接插入排序
        for i in range(gap,length):
            j = i
            while j-gap>=0 and arr[j]<arr[j-gap]:
                t = arr[j]
                arr[j] = arr[j-gap]
                arr[j-gap] = t
                j-=gap
        gap//=2
arr = [6,-2,0,9]
shellSort(arr)
print(arr)


6.堆排序


【算法思想】


堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。


基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(升序方法)

  c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。


【代码实现】


class HeapSort:
    def heapSort(self, nums):
        length = len(nums)
        # 从后往前遍历,交换堆顶与最后叶子节点,并依次调整堆,重复操作
        for j in range(length-1,0,-1):
            # 获取堆顶元素(获取同时,调整堆)
            firstNum = self.adjustHeap(nums,j+1)
            # 交换最后一个叶子节点与堆顶元素
            temp = nums[j]
            nums[j] = firstNum
            nums[0] = temp
        return nums
    # 调整堆(最大堆),每次返回最大堆顶元素
    def adjustHeap(self,nums,length):
        # 最后一个非叶节点
        i = length//2 -1
        # 从最后一个非叶节点开始调整,构成最大堆
        while i>=0:
            temp = nums[i]
            k = 2*i+1
            while k<length:
                if k+1<length and nums[k]<nums[k+1]:
                    k+=1
                if nums[k]>temp:
                    nums[i]=nums[k]
                    i=k
                else:
                    break
                k=2*k+1
            nums[i] = temp
            i-=1
        return nums[0]
s = HeapSort()
nums = [8,9,7,10]
t = s.heapSort(nums)
print(t)


7.归并排序


【算法思想】


归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。


【代码实现】


def mergeSort(nums):
    if len(nums)<=1:
        return nums
    mid = len(nums)//2
    left = mergeSort(nums[:mid])
    right = mergeSort(nums[mid:])
    return merge(left,right)
def merge(left,right):
    result = []
    i,j = 0,0
    while i<len(left) and j<len(right):
        if left[i]<=right[j]:
            result.append(left[i])
            i+=1
        else:
            result.append(right[j])
            j+=1
    if i<len(left):
        result+=left[i:]
    if j<len(right):
        result+=right[j:]
    return result
nums = [5,3,0,6,1,4]
t = mergeSort(nums)
print(t)


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


精彩推荐


「2019 Python开发者日」演讲议题全揭晓!这一次我们依然“只讲技术,拒绝空谈”10余位一线Python技术专家共同打造一场硬核技术大会。更有深度培训实操环节,为开发者们带来更多深度实战机会。更多详细信息请咨询13581782348(微信同号)。


640?wx_fmt=png


推荐阅读:

  • 技术头条

  • 收藏指数爆表!CVPR 2018-2019几十篇优质论文解读大礼包! | 技术头条

  • 分析11年21部漫威电影,一览导演、主演、口碑票房最佳......

  • 靠找Bug赚了6,700,000元!他凭什么?

  • 30位90后霸榜! 福布斯: 比你年轻、比你有颜、比你有才华, 就是他们了!

  • 程序员深夜逆行被拦后崩溃欲自杀:老板在催我!女朋友在催我!

  • 微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念 | 人物志

  • OpenStack已死?恐怕你想多了 | 技术头条

640?wx_fmt=png

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

相关文章:

【C++】google gtest 详解

1、参考博客&#xff1b; https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 2、编译和安装 $ git clone https://github.com/google/googletest.git $ cd googletest $ mkdir mybuild $ cd mybui…

JS学习笔记之call、apply的用法

1、call和apply的区别 call和apply唯一的区别是传入参数的形式不同。 apply接受两个参数&#xff0c;第一个参数指定了函数体内this对象的指向&#xff0c;第二个参数为一个带下标的集合&#xff0c;可以是数组&#xff0c;也可以是类数组&#xff0c;apply方法会把集合中的元素…

实验LVS+keepalived

lvs说明:目前有三种IP负载均衡技术&#xff08;VS/NAT、VS/TUN和VS/DR&#xff09;&#xff1b;八种调度算法&#xff08;rr,wrr,lc,wlc,lblc,lblcr,dh,sh&#xff09;。在调度器的实现技术中&#xff0c;IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转…

Spark Streaming笔记整理(二):案例、SSC、数据源与自定义Receiver

[TOC] 实时WordCount案例 主要是监听网络端口中的数据&#xff0c;并实时进行wc的计算。 Java版 测试代码如下&#xff1a; package cn.xpleaf.bigdata.spark.java.streaming.p1;import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.Spar…

复旦邱锡鹏教授公布《神经网络与深度学习》,中文免费下载 | 极客头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑整理 | Jane出品 | AI科技大本营优质的人工智能学习资源一直是大家非常关注的&#xff0c;以往我们也推荐过很多优秀的课程、书籍等&#xff0c;不过大多来自国外的名校、名师&#xff0c…

【Qt】信号和槽传递自定义结构体

一、使用信号和槽传递自定义结构体 这是一个老问题了,但是每次使用都要bing,因此做个笔记整理下。 一共有三种方法,可以让结构体在信号和槽之间传递。前两种方法可以让结构体在线程之间传递,最后一种方法只能在同一线程中传递。 Q_DECLARE_METATYPE qRegisterMetaType(推…

Tomcat:Connection reset by peer: socket write error

Connection reset by peer: socket write error错误分析及解决 Connection reset by peer: socket write error错误分析&#xff1a; 常出现的Connection reset by peer: 原因可能是多方面的&#xff0c;不过更常见的原因是&#xff1a; ①&#xff1a;服务器的并发连接数超过…

人脸识别的“生意经”

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | Jeff John Roberts译者 | 孙薇责编 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;不经意间&#xff0c;科技公司便拿着你的照片&#xff0c;推…

【Qt】pro中使用DEFINES来实现条件编译

1、pro中使用DEFINES来实现条件编译 在Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。 如,在pro中: #定义条件编译宏LAOER DEFINES += LAOER #依赖编译宏LAOER的编译选项: contains(DEFINES, LAOER){message(hello Laoer) } #与编译宏LAOER冲突的编译选项: …

nodejs -- promise的返回

为什么80%的码农都做不了架构师&#xff1f;>>> [javascript] view plain copy const a async () > { return Sequelize.findAll({}) //这里返回一个promise&#xff0c;"aaaaa"也行 } const b async ()>{ const result await a…

SQL 将一列数据转为一行字符串[转]

比如&#xff1a;我用select department,userName from users从表中查询出如下数据department | userName--------------- --------------it it1it it2it it3ur ur1ur ur2我能不能用什么SQL对department进行分组然后变成如下的结果呢&#xff1f;department | userName--------…

【C++】C++11的enum class enum struct和enum

1、问题描述 在走读QtCreator中看到一段代码 在QtCreator-v4.9.2源码中 src\plugins\projectexplorer\projectnodes.h enum class NodeType : quint16 {File 1,Folder,VirtualFolder,Project };以前一直使用enum&#xff0c;这里使用的是enum class&#xff0c;新enum的好处…

浙大首届AI专业本科生将于9月入学,纳入竺院图灵班

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;据澎湃新闻报道&#xff0c;浙江大学计算机科学与技术学院副院长、浙江大学人工智能研究所所长吴飞…

解决阿里云无法正常使用samba的问题【转】

转自&#xff1a;https://blog.csdn.net/u011949148/article/details/54311288 昨天在阿里云上申请了一个云服务器&#xff0c;系统用的是ubuntu14.04&#xff0c;由于是免费的&#xff08;初次使用&#xff09;&#xff0c;配置较低&#xff08;单核1G内存&#xff0c;40G硬盘…

Google又放大招:高效实时实现视频目标检测 | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | 陈泰红&#xff0c;算法工程师&#xff0c;研究方向为机器学习、图像处理来源 | 极市平台&#xff08;ID&#xff1a;extrememart&#xff09;图像目标检测是图像处理领域的基础。…

一个java删除文件夹的小方法

java删除文件夹都是从里向外删除&#xff0c;使用递归的方法。public class IO_FILEdemo09 {public static void main(String[] args) {// TODO Auto-generated method stub// 删除目录演示File dir new File("C:\\version1");DeleteAll(dir);}public static void D…

【C++】operator bool() 和 operator const bool() const

1、问题描述 在走读QtCreator源码时&#xff0c;看到如下运算符重载 源码在QtCreator-v4.9.2中 src\plugins\projectexplorer\projectexplorer.h class OpenProjectResult { public:OpenProjectResult(const QList<Project *> &projects, const QList<Project *…

tomcat高并发的配置

以下内容来源于互联网&#xff0c;具体出处不详 据说服务器运行TOMCATJDK环境能负载到动态1W的并发&#xff0c;贴上他的配置&#xff0c;以后有机会在测试&#xff01; java 环境配置&#xff1a; export JAVA_OPTS"-server -Xms8g -Xmx8g -Xss128k -XX:ParallelGCThread…

【AI】图示:精确度(查准率)Precision、召回率(查全率)Recall

对Precision、Recall的直译是“精确度”和“召回率”&#xff0c;第一次接触这两个词&#xff0c;很难从字面上知道它们的含义。而翻译成“查准率”和“查全率”就比较好理解&#xff0c;下面统一使用“查准率”和“查全率”。 1、真假正负例 真正例&#xff08;True Positive…

@程序员,如何“终身成长”与跨界?

文 / Ant说《终身成长》是一碗“鸡汤”并不为过&#xff0c;截止到我看过的前半部分&#xff0c;围绕在一个主题展开——人的潜力是不可知的。换句话说&#xff0c;任何人都有可能成为自己想成为的人。书中列举了大量明星企业与管理者的真实案例&#xff0c;也引用了许多对比实…

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

tcp可以通过滑动窗口和拥塞算法实现流量控制&#xff0c;限制上行和下行的流量&#xff0c;但是却不能抵御ddos攻击。 限流只是限制访问流量的大小&#xff0c;是无法区分正常流量和异常攻击流量的。 限流可以控制本软件或者应用的流量大小&#xff0c;从而减少对部署在相同物理…

WPF及Silverlight中将DataGrid数据导出

这段源码是我在项目中实际应用的源码&#xff0c;没有经过删减及处理。 如果你认为有用可以摘去作为自己的导出类中的一个小工具使用。 ///<summary>///数据源导出辅助类 ///</summary>///<remarks>///Author: sucsy ///Create date: 2011-…

首发 | 驭势科技推出“东风网络”:如何找到速度-精度的最优解?| 技术头条...

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | 驭势科技给定目标硬件&#xff0c;如何确定最优的速度-精度折衷边界&#xff1f;换言之&#xff1a;给定推断延时的限制&#xff0c;模型能达到的最高精度是多少&#xff1f…

【AI】caffe使用步骤(一):将标注数据生成lmdb或leveldb

1、简述 caffe使用工具 convert_imageset 将标注数据转换成lmdb或leveldb格式&#xff0c;convert_imageset 使用方法可以参考脚本examples/imagenet/create_imagenet.sh。 convert_imageset 在./build/tools/中。 2、convert_imageset命令行参数 ./build/tools/convert_ima…

日本的GMO增加了比特币现金,和另外3种用于贷款项目的加密货币

2019独角兽企业重金招聘Python工程师标准>>> 日本的加密货币交易所 GMO正在不断地向其贷款项目中增加更多的货币&#xff0c;这使得它的客户可以将加密货币借给公司。最初&#xff0c;该项目是为BTC启动的&#xff0c;但现在GMO已经走得更远&#xff0c;并添加了比特…

功能演示:戴尔PowerConnect 8024交换机VLAN的创建与删除

戴尔PowerConnect 8024是一款带24个10 Gb以太网10GBASE-T端口的高密度10 Gb以太网交换机&#xff0c;专为具有高吞吐量和高可用性需求的数据中心、聚合和统一结构部署而设计。 这些高密度10 Gb交换机可用于汇聚型以太网环境&#xff0c;支持密集型虚拟化、iSCSI存储和10 Gb流量…

【AI】caffe使用步骤(二):设计网络模型prototxt

【一】以 lenet_train_test.prototxt 为例 name: "LeNet" layer {name: "mnist"type: "Data"top: "data"top: "label"include {phase: TRAIN}transform_param {scale: 0.00390625}data_param {source: "examples/mnis…

南大和中大“合体”拯救手残党:基于GAN的PI-REC重构网络,“老婆”画作有救了 | 技术头条...

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑编译 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;对于喜欢画画的你来说&#xff0c;总是画得七零八落&#xff0c;不堪入目&#xff0c;但现在&#xff0c;有一…

区块链技术应用领域和优势

区块链的应用正成为很多人关注的领域 &#xff0c;有很多的新应用正在逐步的实施当中&#xff0c;各种的区块链应用也是让众人惊喜不断&#xff0c; 随着区块链技术的发展 &#xff0c;各行各业在应用中所获取的成效也是越来越大&#xff0c; 这大大激发了人们对于区块链技术的…

Kataspace:用HTML5和WebGL创建基于浏览器的虚拟世界

源自斯坦福的创业公司Katalabs发布了一个用于创建基于浏览器的虚拟世界的开源框架。名叫KataSpace的软件&#xff0c;利用了新兴的HTML5技术&#xff0c;以及WebGL和WebSockets&#xff0c;允许用户无需安装任何插件&#xff0c;直接在浏览器的3D环境中展开互动。Katalabs已经推…