今天总结了一下常用的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. MySQL5.7 新增配置

    1.log_timestamps 在5.7.2以后的版本中增加一个单独控制error log , general log,slow log的记录的时间,默认是UTC,需要配置成SYSTEM(本地时间) ...

  2. Improve Your Study Habits

    1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...

  3. 跟我一起数据挖掘(22)——spark入门

    Spark简介 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapR ...

  4. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  5. 数据库基础,表及SQL语句

    数据库基础及T-SQL语句 字符类型: int 整型 float 小数 double 小数 varchar(20) 字符串 bit 布尔型数据 datetime 日期时间类型 text 长文本 (以下 ...

  6. iOS-网络处理

    1.iOS-网络基础 2.iOS-网络处理框架AFN 3.iOS-网络爬虫

  7. Android Studio自动删除多余的import

    在开发过程中,随着项目的迭代,文件内部分import 可能早已经不用了,对于这种无用的 import,我们不可能一个一个文件的删除.这里记录个自动删除无用import的功能. 一 .开发环境: And ...

  8. IOS开发之获取Storyboard创建的ViewController

    前面的两篇博客都是学习有关屏幕适配也就是相对布局的东西,这篇博客中将会学习视图间的切换.视图间的切换我们可以用代码完成或者用storyboard来建立各个视图控制器间的关系.在需要用到代码进行切换时会 ...

  9. 高级javascript---变量作用域

    变量作用域 (JavaScript) JavaScript 有两个范围:全局和局部. 在函数定义之外声明的变量是全局变量,它的值可在整个程序中访问和修改. 在函数定义内声明的变量是局部变量. 每当执行 ...

  10. Redis入门

    一.安装 目前,官方最新稳定版本为3.0.7 # wget http://download.redis.io/releases/redis-3.0.7.tar.gz # cd /usr/local/ ...