今天总结了一下常用的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. Atitit 深入理解抽象类与接口 attilax总结

    Atitit 深入理解抽象类与接口 attilax总结 1.1. 主要区别接口侧重于动作抽象..抽象类是属性名词抽象..1 1.2. 抽象层次类>>抽象类>>接口1 1.3. ...

  2. iOS-技巧性总结

    1.AFN与ASI对比 -- AFN1. 基于 NSURLConnection & NSURLSession 进行的封装2. 使用简单3. 提供了自动的序列化 & 反序列化支持! AF ...

  3. ECMAScript6学习笔记 ——let、const、变量解构赋值

    let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...

  4. 轻量级前端MVVM框架avalon - ViewModel

    废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...

  5. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  6. 爆一个VS2015 Update1更新带来的编译BUG【已有解决方案】

    一个编译的BUG,在原生的VS2015中没有问题,但更新至VS2015 Update1之后就有了,大概是Update1用了新的编译器,害得我好苦.经测试,VS2013 Update5中也存在这个问题, ...

  7. tn文本分析语言(三):高级语法

    标签(空格分隔): 未分类 高级操作 1.脚本表达式 用双引号包含的脚本被称为脚本表达式,目前支持嵌入Python. 脚本表达式只能在顺序表达式中使用.代码可以在三个位置存在: |位置|功能|例子| ...

  8. 如何从源码中学习javascript

    艾伦说啊,学习javascript,必须要学会看源码,通过高手的源码,你可以从中吸取很多书本上难以看到的技巧. 看源码就好像喝鸡汤,所有的营养都在这汤里了.这汤就是源码,高手写的源码,就是最好的鸡汤. ...

  9. 设计数据库字段或者java中使用boolean型时需谨慎

    boolean型变量只有两个值 false和true,我们在设计数据库字段时或者定义java变量时会使用boolean,通常情况下开关类的变量使用无可非议,但请一定要考虑到扩展性. 使用前请仔细考虑一 ...

  10. 让自己也能使用Canvas

    <canvas> 是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形.例如:画图,合成照片,创建动画甚至实时视频处理与渲染. 兼容性方面,除了一些骨灰级浏览器IE6.IE ...