原文地址:

本文地址:http://www.cnblogs.com/aiweixiao/p/8202360.html

Original 2018-01-02 关注 微信公众号 程序员的文娱情怀

1.概述

常见的排序算法,虽然很基础,但是很见功力,如果能思路清晰,很快写出来各个算法的代码实现,还是需要花一点功夫的,今天,就跟大家盘点下常用的一些算法。

冒泡排序

插入排序

选择排序

希尔排序

堆排序

归并排序

快速排序

2.各个排序代码实现(PHP版本)

代码详见GitHub: http://t.cn/RHjBCU7

2.1 冒泡排序


1)【定义】:就是第一个位置上的数与他相邻第二个位置上的数比较,如果比他相邻的数小,则两者交换位置,否则不交换。接着第一个位置上的数与第三个位置上的数比较大小,也是小则交换,一直到和最后一个位置的数比较交换完毕。然后,是下一个循环,就是第二个位置上的数重复上面的比较交换操作,直到把整个数列变成是一个从小到大的有序序列。

2)【代码实现】:两层for循环搞定。

 
冒泡排序

2.2 插入排序


1)【定义】:从一堆待排序的数列中选出来一个最小值(可以认为第一个数就是已排序的数列),然后从剩余的带排序的数列中选出来最小值有序放到已排序的数列中,依次操作,直到最后的数列都是一个从小到大的有序数列为止。

2)【代码实现】:

 
插入排序

2.3 选择排序


1)【定义】: 从一堆待排序的数列中选出来一个最小值,放到新的数组的第一个位置,继续从剩余的数列中选取最小值放入到数组中,重复上面的步骤,将数字都取出来排成新的有序数列。

2)【代码实现】:

 
选择排序主函数
 
选择排序子函数

2.4 希尔排序


1)【定义】: 插入排序的一种改进,先比较一定距离的元素成为有序数列,再比较缩小增量距离的元素(可为元素的数量的一半),一直到比较的是相邻元素的时候,就成为了插入排序。所以希尔排序是插入排序的改进。

2)【代码实现】:

 
希尔排序

2.5 堆排序


1)【定义】:1️⃣构造大顶堆 2️⃣交换堆顶和堆底 3️⃣重复前面的步骤升序排列完成

详细说明参看: https://www.cnblogs.com/chengxiao/p/6129630.html

2)【代码实现】

 
堆排序主函数heapSort()
 
堆排序子函数

2.6 归并排序


1)【定义】:就是将待排序的数列看成是单个的有序的数列,然后进行合并,直到合并成最后的完成整有序的数列。

详细可参考:https://www.cnblogs.com/jingmoxukong/p/4308823.html

2)代码实现:

主函数mergeSort(),两个子函数mergePass() 和 merge()

 
归并排序主函数mergeSort()
 
归并排序子函数mergePass()
 
归并排序子函数merge() 

2.7 快速排序


1)定义:该算法的基本思想是:

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

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

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

2)代码实现:

 
快速排序

3.排序总结

各种排序的稳定性,时间复杂度、空间复杂度、稳定性总结如下图:

 
排序算法比较
 

《常见排序算法--PHP实现》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. gdb常用命令记录

    gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...

  2. firewall防火墙

    firewall防火墙 1 防火墙简介 在基于RHEL7的服务器,提供了一个firewall的动态管理的防火墙,其支持IPv4和IPv6,还支持以太网桥,并有分离运行时间和永久性配置选择.它还具备一个 ...

  3. 『素数 Prime判定和线性欧拉筛法 The sieve of Euler』

    素数(Prime)及判定 定义 素数又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,否则称为合数. 1既不是素数也不是合数. 判定 如何判定一个数是否是素数呢?显然,我 ...

  4. 从锅炉工到AI专家(11)(END)

    语音识别 TensorFlow 1.x中提供了一个语音识别的例子speech_commands,用于识别常用的命令词汇,实现对设备的语音控制.speech_commands是一个很成熟的语音识别原型, ...

  5. MySQL优化指南

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  6. ELK-logstash案例实战之读取日志输出到elasticsearch

    简介:从日志文件中读取日志,输出到elasticsearch集群中 $ cd /home/es/logstash-/config $ vim test3_es.conf $ cd /home/es/l ...

  7. 【Java基础】【22IO(其他流)&Properties】

    22.01_IO流(序列流)(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方 ...

  8. PE知识复习之PE的绑定导入表

    PE知识复习之PE的绑定导入表 一丶简介 根据前几讲,我们已经熟悉了导入表结构.但是如果大家尝试过打印导入表的结构. INT IAT的时候. 会出现问题. PE在加载前 INT IAT表都指向一个名称 ...

  9. PE知识复习之PE的导出表

    PE知识复习之PE的导出表 一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗. 答案: 不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就 ...

  10. JAVA 连等赋值问题

    一.描述 关于 Java 连等赋值,例如a=b=c;我们知道它是从右往左依次赋值的,其结果大致可以拆分为b=c;a=b;,但是当栈中没有持有变量的引用时,则会出现问题,例如: public class ...