几个简单易懂的排序算法php
几个简单易懂的排序算法。排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。
<?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的更多相关文章
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
随机推荐
- 使用ArcGIS Runtime 100 进行本地GIS数据处理的注意事项
如下图所示,如果需要使用ArcGIS Runtime 100 进行本地GIS数据处理,则需要依赖Local Server通过发布GP服务实现. 一.ArcGIS Runtime所使用的GPK是有版本限 ...
- json 平面转树状 child [zhuan]
<script> /** * json格式转树状结构 * @param {json} json数据 * @param {String} id的字符串 * @param {String} 父 ...
- 【CLR Via C#】2 程序集
1 定义: 程序集是net 应用程序的部署单元,是组件服用,以及实施安全策略和版本策略的最小单元. 程序集是包含一个或者多个类型定义文件和资源的集合 本地dll或exe与程序集不同 ...
- Linux sudo 命令使用简介
Linux sudo 命令使用简介 by:授客 QQ:1033553122 基本语法: $ sudo [-u username] [command] -u:将身份变成username的身份 #编辑/e ...
- Oracle EBS OM 取消订单
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- 找回master库中被删除的系统表
接手的某个数据库实例中,master数据库中的所有系统表都被误删除掉了. 最直接影响就是一旦涉及到要查询这些系统表,就会出现错误. 例如,右键点击某个数据,查看属性时会出现如下图所示错误: 那么怎么找 ...
- 浅析C#中的Attribute
原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...
- python 3.6 的 venv 模块
今天,在在使用 pycharm 的使用,进行创建 python的时候,发现使用默认的创建的选项使用的python 3环境 .而我系统默认的python环境是 python 2.7 环境:这就引起了我的 ...
- mybatis 中的<![CDATA[ ]]>
在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...
- [WPF]启动参数
在App.xaml.cs中重写方法OnStartup protected override void OnStartup(StartupEventArgs e) { //e.Args为命令行参数 // ...