往前。

<?php
/**
 * 选择排序
 * 工作原理是每次从待排序的元素中的第一个元素设置为最小值,
 * 遍历每一个没有排序过的元素,如果元素小于现在的最小值,
 * 就将这个元素设置成为最小值,遍历结束就将最小值和第一个没有排过序交换位置,
 * 这样的遍历需要进行元素个数-1次
 * 这是一个不稳定的排序算法(排序后相对次序改变了)
 * 对于选择排序如何找到最小元是关键 所以我们需要使用堆排序
 */

    //生成指定区间不重复数组
    function uniqueRandom($min, $max, $num) {
        $count = 0;
        $return = [];

        while($count < $num) {
            //生成指定数值期间的随机数
            $return[] = mt_rand($min, $max);
            //用两次键值翻转,去除数组中重复的数据项
            $return = array_flip(array_flip($return));
            $count = count($return);
        }
        //再次作一下随机排序
        shuffle($return);
        return $return;
    }

    //选择排序
    function selectionSort(&$arr) {
        $count = count($arr);

        for ($j = 0; $j < $count; $j++) {
            //把第一个没有排过序的元素设置为最小值
            $minPos = $j;
            //遍历每一个没有排过序的元素
            for ($i = $j + 1; $i < $count; $i++) {
                //如果这个值小于最小值
                if ($arr[$i] < $arr[$minPos]) {
                    //把最小值的位置设置为这个元素的位置
                    $minPos = $i;
                }
            }

            //内循环结束把最小值和没有排过序的元素交换
            if ($minPos != $j) {
                list($arr[$j], $arr[$minPos]) = [$arr[$minPos], $arr[$j]];
            }
        }
    }

    $arr = uniqueRandom(1, 100000, 5000);
    $start = microtime(true);
    selectionSort($arr);
    $end = microtime(true);
    $used = $end - $start;
    echo "selectionSort() used $used s" . PHP_EOL;
    echo '<br/>';
    /*
    for ($i = 0; $i < count($arr)/100; $i++) {
        echo $arr[$i] . '<br/>';
    }
    */
    //php内置排序, 性能超过自己写的好多倍~~:()
    $arr = uniqueRandom(1, 100000, 5000);
    $start = microtime(true);
    asort($arr);
    $end = microtime(true);
    $used = $end - $start;
    echo "asort() used $used s" . PHP_EOL;
    echo '<br/>';
?>

输出

selectionSort() used 0.52305197715759 s
asort() used 0.0010001659393311 s 

php的选择排序的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. Html5 简单选择排序演示

    简单选择排序,是选择排序算法的一种.基本思想:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止.由于在每次循环中,会对数值相等的元素改变位置,所以属于非稳定 ...

  3. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

  4. JavaScript算法(冒泡排序、选择排序与插入排序)

    冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...

  5. 基本排序算法——选择排序java实现

    选择排序与冒泡排序有很大的相同点,都是一次遍历结束后能确定一个元素的最终位置,其主要思路是,一次遍历选取最小的元素与第一个元素交换,从而使得一个个元素有序,而后选择第二小的元素与第二个元素交换,知道, ...

  6. java基础算法之选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...

  7. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  8. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  9. SelectionSort,选择排序

    /**算法:选择排序1,从当前未排序的正数中找一个最小的整数,将它放在已排序的整数列表的最后2.要点:选择排序选最小的,往左边选*/ #include <stdio.h>void Sele ...

  10. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

随机推荐

  1. Android Studio 之 控件基础知识

    1. TextView 和 EditText 控件常用属性  android:layout_width="match_parent" 宽度与父控件一样宽 android:layou ...

  2. 远程windows

    1. 起因 因为经常用teamviewer,所以断定我是商业用户,不允许我用了.想买一个授权,结果太贵了,1700多.使用了很多其他的,向日葵卡顿,有的窗口点不到,vnc慢,效果差,卡顿,还收费,等等 ...

  3. c# 自定义按钮,渐变颜色(含中心向四周渐变,单方向渐变)

    废话不多言,直接代码: public class RoundButton : Button { bool clickBool = false; //1.设置圆形 //2.设置渐变色 //3.设置too ...

  4. Leetcode 5281. 使结果不超过阈值的最小除数

    又一次参赛,除了第一道Easy题和第二道Medium外,剩下的两道在有限时间内,要么没思路,要么思路不对,超时,要么有思路调试出错,还需多加练习! (这次的第三题,在循环从1开始,直到找到满足地为止, ...

  5. FPFA学习笔记的系列

    1.Zynq 学习裸跑系列 学会Zynq(1)搭建Zynq-7000 AP SoC处理器 作者:FPGADesigner 学会Zynq(2)Zynq-7000处理器的配置详解 作者:FPGADesig ...

  6. java 查找指定包下的类

    package com.jason.test; import java.io.File; import java.io.IOException; import java.io.UnsupportedE ...

  7. 1.0EnterpriseFrameWork 框架学习

    1.先报其主页 :博主的框架是开源的 http://www.cnblogs.com/kakake/p/3938262.html . 2.学习的精髓是:该框架支持 ORM.SQL语句 和 存储过程 ,O ...

  8. Gearman介绍、原理分析、实践改进

    gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务j ...

  9. IDEA超级实用的几个快捷键

    最近开始使用IDEA,突然发现的比较的实用的几个快捷键 这些快捷键用的好的话真的可以提升很多效率 还有一些比较简单的快捷键,相信大家都会 Ctrl+X:剪切 Ctrl+C:复制 Ctrl+V:粘贴 C ...

  10. N-gram理解

    如何来理解这个概率呢? p( i love you) 如果是 =p(i)p(love)p(you) 就是只考虑单词出现的概率本身. 如果是  =p(i)p(love|i)p(you|love)  就是 ...