今天总结了一下常用的7种排序方法,并用php语言实现。

  1. 直接插入排序

     /*
    * 直接插入排序,插入排序的思想是:当前插入位置之前的元素有序,
    * 若插入当前位置的元素比有序元素最后一个元素大,则什么也不做,
    * 否则在有序序列中找到插入的位置,并插入
    */
    function insertSort($arr) {
    $len = count($arr);
    for($i = 1; $i < $len; $i++) {
    if($arr[$i-1] > $arr[i]) {
    for($j = $i - 1;$j >= 0; $j-- ) {
    $tmp = $arr[$j+1];
    if($tmp < $arr[$j]) {
    $arr[$j+1] = $arr[$j];
    $arr[$j] = $tmp;
    }else{
    break;
    }
    }
    }
    }
    return $arr;
    }
  2. 冒泡排序

     /*
    冒泡排序,冒泡排序思想:进行 n-1 趟冒泡排序, 每趟两两比较调整最大值到数组(子数组)末尾
    */
    function bubbleSort($arr) {
    $len = count($arr);
    for($i = 1; $i < $len; $i++) {
    for($j = 0; $j < $len-$i; $j++) {
    if($arr[$j] > $arr[$j+1]) {
    $tmp = $arr[$j+1];
    $arr[$j+1] = $arr[$j];
    $arr[$j] = $tmp;
    }
    }
    }
    return $arr;
    }
  3. 简单选择排序

     /*
    简单选择排序, 简单排序思想:从数组第一个元素开始依次确定从小到大的元素
    */
    function selectSort($arr) {
    $len = count($arr);
    for($i = 0; $i < $len; $i++) {
    $k = $i;
    for($j = $i+1; $j < $len; $j++) {
    if($arr[$k] > $arr[$j]) {
    $k = $j;
    }
    }
    if($k != $i) {
    $tmp = $arr[$i];
    $arr[$i] = $arr[$k];
    $arr[$k] = $tmp;
    }
    }
    return $arr;
    }
  4. 希尔排序

     /*
    希尔排序,希尔排序原理:将数组按指定步长分隔成若干子序列,然后分别对子序列进行排序(在这是直接)
    */
    function shellSort($arr) {
    $len = count($arr);
    $k = floor($len/2);
    while($k > 0) {
    for($i = 0; $i < $k; $i++) {
    for($j = $i; $j < $len, ($j + $k) < $len; $j = $j + $k) {
    if($arr[$j] > $arr[$j+$k]) {
    $tmp = $arr[$j+$k];
    $arr[$j+$k] = $arr[$j];
    $arr[$j] = $tmp;
    }
    }
    }
    $k = floor($k/2);
    }
    return $arr;
    }
  5. 快速排序

     /*
    * 快速排序,快排思想:通过一趟排序将待排的记录分为两个独立的部分,其中一部分的记录的关键字均不大于
    * 另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序,具体做法需要
    * 每趟排序设置一个标准关键字和分别指向头一个记录的关键字和最后一个记录的关键字的指针。
    * quickSort($arr, 0, count($arr) -1);
    */
    function quickSort(&$arr,$low,$high) {
    if($low < $high) {
    $i = $low;
    $j = $high;
    $primary = $arr[$low];
    while($i < $j) {
    while($i < $j && $arr[$j] >= $primary) {
    $j--;
    }
    if($i < $j) {
    $arr[$i++] = $arr[$j];
    }
    while($i < $j && $arr[$i] <= $primary) {
    $i++;
    }
    if($i < $j) {
    $arr[$j--] = $arr[$i];
    }
    }
    $arr[$i] = $primary;
    quickSort($arr, $low, $i-1);
    quickSort($arr, $i+1, $high);
    }
    }
  6. 堆排序

     /*
    堆排序
    */ // 调整子堆的为大根堆的过程,$s为子堆的根的位置,$m为堆最后一个元素位置
    function heapAdjust(&$arr, $s, $m) {
    $tmp = $arr[$s];
    // 在调整为大根堆的过程中可能会影响左子堆或右子堆
    // for循环的作用是要保证子堆也是大根堆
    for($j = 2*$s + 1; $j <= $m; $j = 2*$j + 1) {
    // 找到根节点的左右孩子中的最大者,然后用这个最大者与根节点比较,
    // 若大则进行调整,否则符合大根堆的 特点跳出循环
    if($j < $m && $arr[$j] < $arr[$j+1]) {
    $j++;
    }
    if($tmp >= $arr[$j] ) {
    break;
    }
    $arr[$s] = $arr[$j];
    $s = $j;
    }
    $arr[$s] = $tmp;
    } // 堆排序
    function heapSort($arr) {
    $len = count($arr);
    // 依次从子堆开始调整堆为大根堆
    for($i = floor($len/2-1); $i >= 0; $i--) {
    heapAdjust($arr, $i, $len-1);
    }
    // 依次把根节点调换至最后一个位置,再次调整堆为大根堆,找到次最大值,
    // 依次类推得到一个有序数组
    for($n = $len-1; $n > 0; $n--) {
    $tmp = $arr[$n];
    $arr[$n] = $arr[0];
    $arr[0] = $tmp;
    heapAdjust($arr, 0, $n-1);
    }
    return $arr;
    }
  7. 归并排序

     /*
    归并排序,这里实现的是两路归并
    */
    // 分别将有序的$arr1[s..m]、$arr2[m+1..n]归并为有序的$arr2[s..n]
    function Merge(&$arr1, &$arr2, $s, $m, $n) {
    for($k = $s,$i = $s, $j = $m+1; $i <= $m && $j <= $n; $k++) {
    if($arr1[$i]<$arr1[$j]) {
    $arr2[$k] = $arr1[$i++];
    }else {
    $arr2[$k] = $arr1[$j++];
    }
    }
    if($i <= $m) {
    for(; $i <= $m; $i++) {
    $arr2[$k++] = $arr1[$i];
    }
    } else if($j <= $n) {
    for(; $j <= $n; $j++) {
    $arr2[$k++] = $arr1[$j];
    }
    }
    } // 递归形式的两路归并
    function MSort(&$arr1, &$arr2, $s, $t) {
    if($s == $t) {
    $arr2[$s] = $arr1[$s];
    }else {
    $m = floor(($s+$t)/2);
    $tmp_arr = array();
    MSort($arr1, $tmp_arr, $s, $m);
    MSort($arr1, $tmp_arr, $m+1, $t);
    Merge($tmp_arr, $arr2, $s, $m, $t);
    }
    } // 对一位数组$arr[0..n-1]中的元素进行两路归并
    function mergeSort($arr) {
    $len = count($arr);
    MSort($arr, $arr, 0, $len-1);
    return $arr;
    }

    使用经验

  1. 若排序的记录数目n较小时,可以采用直接插入排序和简单选择排序,当记录本身信息量较大时,用简单选择排序方法较好。
  2. 若待排序记录按关键字基本有序,适合采用直接插入排序和冒泡排序。
  3. 若n值较大时,可以采用快速排序、堆排序和归并排序。另外快速排序被认为是内部排序方法中最好的方法。

php语言实现的7种基本的排序方法的更多相关文章

  1. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  2. Java几种常见的排序方法

    日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一 ...

  3. 几种常见的排序方法总结(Python)

    几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...

  4. 几种常见的排序方法(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include <Windows.h> //直接插入排序 void InsertSo ...

  5. C# 几种常见的排序方法

    1.冒泡排序 //冒泡排序 public void BubbleSort(int[] list) { int i, j, temp; bool done = false; j = ; while (( ...

  6. C#编写的 8种初级+高级排序方法(转)

    摘自:http://blog.csdn.net/mevin/article/details/6714520 程序代码: view plaincopy to clipboard using System ...

  7. 比较两种数组随机排序方法的效率 JavaScript版

    //比较2中数组随机排序方法的效率 JavaScript版 //randon1思路 //当len=5时候,从0-5中随机3一个放入i=0, // 从0-3随机一个2放入i=2 // 从0-2随机一个1 ...

  8. ch1_6_1求解两种排序方法问题

    考拉有n个字符串字符串,任意两个字符串长度都是不同的.  考拉最近学习到有两种字符串的排序方法:   1.根据字符串的字典序排序.例如: "car" < "carr ...

  9. C语言_了解一下C语言中的四种存储类别

    C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...

随机推荐

  1. Alljoyn之管中窥豹

    Alljoyn之管中窥豹 一.历史: Alljoyn是高通2011年推出的近距离P2P通讯技术,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性.安全性和动态配置,支持Microsoft W ...

  2. 跨域获取json一些理解[腾讯电商数据的拉取方式]

    如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解. ...

  3. [ASP.NET MVC 小牛之路]12 - Section、Partial View 和 Child Action

    概括的讲,View中的内容可以分为静态和动态两部分.静态内容一般是html元素,而动态内容指的是在应用程序运行的时候动态创建的内容.给View添加动态内容的方式可归纳为下面几种: Inline cod ...

  4. Linux服务器配置之加载硬盘

    Linux服务器配置之加载硬盘 1.修改密码 passwd 2.测试密码是否成功 3.查看硬盘信息 fdisk –l 4.格式化分区 fdisk /dev/vdb 5.查看分区 6.快速格式化/dev ...

  5. Chrome开发者工具不完全指南:(三、性能篇)

    卤煮在前面已经向大家介绍了Chrome开发者工具的一些功能面板,其中包括Elements.Network.Resources基础功能部分和Sources进阶功能部分,对于一般的网站项目来说,其实就是需 ...

  6. Base64编码原理分析

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

  7. Spring学习记录(六)---使用外部属性文件

    在bean配置资源或系统部署,如数据库的连接时,需要这样: 要包含相关jar包:c3p0.jar 和mysql.connector.jar xml配置: <bean id="dataS ...

  8. XE2:查看Extended Events收集的数据

    SQL Server 使用Target来存储Events,Target 能够将Events存储到File中(扩展名是 xel),或 memoy buffer 中(Ring Buffer),Event ...

  9. SVN代码冲突解决方案小集合

    对于刚接触svn的人来说,svn冲突后,不能提交是件让人很郁闷的事情.最让人郁闷的事,是代码间的覆盖.你把我代码盖了,我会很火大的.谁把谁的盖了都不爽. 为什么会出现代码冲突问题呢,因为不同的人,同时 ...

  10. Cordova+Asp.net Mvc+GIS跨平台移动应用开发实战1-系统初步搭建(附演示,apk,全部源码)

    1.前言 身处在移动互联网的今天,移动应用开发炙手可热,身为程序猿的我们怎么能错过开发一款我们自己的APP.本人算是一个基于.net的GIS开发入门者(马上就大四啦), 暑假在学校参加GIS比赛有大把 ...