今天总结了一下常用的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. EasyPR--一个开源的中文车牌识别系统

    我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Reco ...

  2. 深圳本土web前端经验交流

    群号:125776555  深圳本土web前端技术交流群 baidu tencent前端拒绝垃圾广告.吹水,欢迎讨论技术.跳槽经验期待您的加入 

  3. CI框架搭建

    CI 框架等移植到不同等环境十分方便,只要改很少等配置: 1.修改config.php 文件(修改这一个文件就可以跑通了): $config['base_url'] = 'http://127.0.0 ...

  4. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...

  5. ASP.NET列表信息以Excel形式导出

    1.从数据查出数据扔进table中: private DataTable getTable() { var dbHelper = applyBLL.CreateDataBase("VISAd ...

  6. Atitit xml命名空间机制

    Atitit xml命名空间机制 命名冲突1 使用前缀来避免命名冲突2 使用命名空间(Namespaces)2 XML Namespace (xmlns) 属性2 默认的命名空间(Default Na ...

  7. C#设计模式-享元模式

    在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然 ...

  8. 深入浏览器兼容 细数jQuery Hooks 属性篇

    关于钩子:http://www.cnblogs.com/aaronjs/p/3387906.html 本章的目的很简单,通过钩子函数更细节的了解浏览器差异与处理方案, 版本是2.0.3所以不兼容ie6 ...

  9. svn迁移到git

    步骤命令如下: > git svn clone https://svn-url/ProjectName --no-metadata --authors-file=user.txt --trunk ...

  10. SqlServer时间戳与普通格式的转换

    /********************************************** 时间戳转换(秒) ******************************************* ...