冒泡排序:

function bubbleSort($array){
  $len=count($array);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++){
    //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++){
      if($array[$k]>$array[$k+1]){
        $tmp=$array[$k+1];
        $array[$k+1]=$array[$k];
        $array[$k]=$tmp;
      }
    }
  }
  return $array;
}

快速排序:

function quickSort($array){
  if (count($array) <= 1) return $array;
  $key=$array[0];
  $left_arr=array();
  $right_arr=array();
  for($i=1;$i<count($array);$i++){
    if($array[$i]<=$key){
      $left_arr[]=$array[$i];
    }else{
      $right_arr[]=$array[$i];
    }
  }
  $left_arr=quickSort($left_arr);
  $right_arr=quickSort($right_arr);
  return array_merge($left_arr,array($key),$right_arr);
}

选择排序:

function selectSort($array) {
  //双重循环完成,外层控制轮数,内层控制比较次数
  $len=count($array);
  for($i=0; $i<$len-1; $i++) {
    //先假设最小的值的位置
    $p = $i;
    for($j=$i+1; $j<$len; $j++) {
      //$array[$p] 是当前已知的最小值
      if($array[$p] > $array[$j]) {
        //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
        $p = $j;
      }
    }
    //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
    if($p != $i) {
      $tmp = $array[$p];
      $array[$p] = $array[$i];
      $array[$i] = $tmp;
    }
  }
  return $array; //返回最终结果
}

插入排序:

function insertSort($array) {
  $len=count($array);
  for($i=1, $i<$len; $i++) {
    $tmp = $array[$i];
    //内层循环控制,比较并插入
    for($j=$i-1;$j>=0;$j--) {
      if($tmp < $array[$j]) {
        //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
        $array[$j+1] = $array[$j];
        $array[$j] = $tmp;
      } else {
        //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
        break;
      }
    }
  }
  return $array;
}

二叉树(二分法)排序:

/**
* 递归方法实现二分查找法.
* @param Array数组
* @param low 数组第一位置
* @param high 最高
* @param k 要查找的值.
* @return 返回值. */
function binSearch($array, $low, $high, $k){
  if ($low <= $high){
    $mid = intval(($low+$high)/2);
    if ($array[$mid] == $k){
      return $mid;
    }elseif ($k < $array[$mid]){
      return binSearch($array, $low, $mid-1, $k);
    }else{
      return binSearch($array, $mid+1, $high, $k);
    }
  }
  return -1;
}

[PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)的更多相关文章

  1. 数组排序代码,冒泡排序&快速排序&选择排序

    冒泡排序: for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1 ...

  2. Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

    三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...

  3. C语音中最简单的排序冒泡排序和选择排序代码实现(非指针)

    #include<stdio.h> int main() { int a[5] = { 2,5,7,3,-1 }; int n = sizeof(a) / sizeof(a[0]);//元 ...

  4. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  5. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  6. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  7. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

  8. C#之快速排序 C#之插入排序 C#之选择排序 C#之冒泡排序

    C#之快速排序   算法描述 1.假定数组首位元素为“枢轴”,设定数列首位(begin)与末位(end)索引: 2.由末位索引对应元素与“枢轴”进行比较,如果末位索引对应元素大于“枢轴”元素,对末位索 ...

  9. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

随机推荐

  1. Sokcet方式请求HTTP/HTTPS的封装类HttpHelper

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  2. nginx平滑升级

    1.查询原来安装配置信息 [root@t-scrmap1-v-szzb local]# netstat -unlatp | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0: ...

  3. oracle 修改密码

    [oracle@t-ecif03-v-szzb ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Mon Nov 1 ...

  4. IDC机房线路质量测试方案

    1.测试节点: 北京:123.206.*.* 上海:139.196.*.* 广州:119.29.*.* 汕头:125.91.*.* 香港:103.20.*.* 美国:198.52.*.* 测试服务器: ...

  5. jsContext全局函数调用与对象函数调用、evaluateScript

    evaluateScript:兼具js加载(生成具体的上下文)(函数与通用变量的加载),与函数执行的功能: 函数调用的方式有两种: 1)获取函数(对象),然后执行调用: [context[@" ...

  6. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  7. 创建文本注记TextElement

    1.创建一个字体 /// <summary> /// 字体设置 /// </summary> /// <param name="size">Th ...

  8. 浅谈ARP协议以及应用

    0. 前言 本章主要简单的介绍ARP的协议格式,主机如何发送和处理ARP报文,以及免费ARP. 1. ARP协议原理 ARP,全称Address Resolution Protocol,地址解析协议, ...

  9. Android开发环境的搭建

    在学习android时,环境的搭建是学习android的第一步,为了记住第一步特写了这篇文章. 第一步,安装jdk,因为eclipse的运行需要jdk才可以,所以jdk的安装时第一步.安装过程和普通的 ...

  10. Redis常用命令

    Redis常用命令Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以再Linux终端使用.1.键值相关命令2.服务器相关命令 一.键值相关命令 1.get get 键值 当 key ...