几个简单易懂的排序算法。排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。

<?php

// 冒泡排序
function bubble_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i< $len; $i++){
// 升序的话,两两比较第一轮排序过后,最后一个一定是最大的了;
// 所以第二轮时$j依然从0开始,但是结束的时候只需要管前$len-1的长度
for($j=0; $j < $len-$i; $j++){
if ($arr[$j] > $arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
} // 选择排序
function select_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i< $len; $i++){
for($j=$i+1; $j <= $len; $j++){
// 选择排序,就是选择下边是$i的元素,固定住它,让它去和$j的比和交换
if ($arr[$j] < $arr[$i]){
$temp = $arr[$j];
$arr[$j] = $arr[$i];
$arr[$i] = $temp;
}
}
}
return $arr;
} // 插入排序
/** 所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。**/
function insert_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i<= $len; $i++){
// 在$i位置前面的元素进行插入
for($j=$i; $j >0; $j--){
if ($arr[$j-1] > $arr[$j]){
$temp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
}
}
return $arr;
} $arr = array(12, 9, 1, 4, 6, -3); $bubble = bubble_sort($arr);
$select = select_sort($arr);
$insert = insert_sort($arr); echo '<pre>';
print_r($bubble); echo '<pre>';
print_r($select); echo '<pre>';
print_r($insert); /**
*
Array
(
[0] => -3
[1] => 1
[2] => 4
[3] => 6
[4] => 9
[5] => 12
)
*/

排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。

用冒泡法实现了一个简单的排序问题,题目是这样的。

<?php
$arr = array(
'B5','D3','B4','B2','C5','A1','A2','A6','A4','A5','A6','B1','C1'
); $len = count($arr) - 1;
for($i=0; $i< $len; $i++){
for($j=0; $j < $len-$i; $j++){
$first_1 = getstr($arr[$j]);
$first_2 = getstr($arr[$j],1);
$second_1 = getstr($arr[$j+1]);
$second_2 = getstr($arr[$j+1],1);
$con1 = $first_1=='A' &&
( $second_1!='A' || ($second_1=='A' && $first_2<$second_2) );
$con2 = $first_1!='A' && $second_1!='A' &&
($first_2<$second_2 || ($first_2==$second_2 && ord($first_1)<ord($second_1) )); if ($con1 || $con2){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
} // 取字符串 A1中的A或者1
function getstr($str,$type=0){
return substr($str, $type,1);
} print_r($arr);
echo array_shift($arr); /** *
Array
(
[0] => C5
[1] => B5
[2] => B4
[3] => D3
[4] => B2
[5] => C1
[6] => B1
[7] => A6
[8] => A6
[9] => A5
[10] => A4
[11] => A2
[12] => A1
)
*
*
C5
*/

几个简单易懂的排序算法php的更多相关文章

  1. 十大经典排序算法+sort排序

    本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...

  2. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  5. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  6. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  7. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  8. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  9. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

随机推荐

  1. 退役前的最后的做题记录upd:2019.04.04

    考试考到自闭,每天被吊打. 还有几天可能就要AFO了呢... Luogu3602:Koishi Loves Segments 从左向右,每次删除右端点最大的即可. [HEOI2014]南园满地堆轻絮 ...

  2. BZOJ5305: [HAOI2018]苹果树

    传送门 果然只有我这种菜鸡才会用这种菜鸡做法QwQ 对于一类要求期望的题目,有一个无脑的做法: 设概率为 \(f\),期望为 \(g\) 每次合并两个二元组 \(<f_1,g_1>,< ...

  3. CentOS7安装mongodb

    1.下载mongodb的*.tar.gz安装包 2.移到centos7中并解压 tar -xzvf mongodb.tar.gz 3.配置环境变量 vim /etc/profile 添加如下内容: # ...

  4. Docker在windows7上的安装

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  5. 使用Apache php 的一些基本操作(一)

    切换目录命令:(就可以在www文件夹里面操作了) cd /var/www/html 新建一个文件: sudo vim info.php (这里出现了一个问题,sudo: vim: command no ...

  6. Android 2018最新的三方库

    文章出处https://blog.csdn.net/qq_32368129/article/details/78749880 1.MaterialStepperView 它是用Material Des ...

  7. JSTL核心标签库——错误处理标签

    <c:catch>标签 Demo: 错误发生时,不转发至其他网页来显示错误信息,而在当前网页捕捉异常,并显示相关信息. <%@page contentType="text/ ...

  8. Python+Selenium笔记(五):生成测试报告

    #HTMLTestRunner代码修改参考 微微微笑 的说明,下面是链接,这个已经说的很详细了 https://www.cnblogs.com/miniren/p/5301081.html (一) 前 ...

  9. leveldb源码分析--BloomFilter

    bloomfilter是leveldb中的一大性能利器,所以为了文章的表现完整性这里新启这么一篇文章.leveldb中的bloomfilter的实现在bloom.cc中,是一个较为简单的实现,所以就不 ...

  10. 【转】Nginx学习---Nginx&&Redis&&hcache三层缓存架构总结

    [原文]https://www.toutiao.com/i6594307974817120782/ 摘要: 对于高并发架构,毫无疑问缓存是最重要的一环,对于大量的高并发,可以采用三层缓存架构来实现,n ...