Skip to content

Instantly share code, notes, and snippets.

@dcb9
Last active August 29, 2015 14:08
Show Gist options
  • Save dcb9/7de4abf45584ee60f616 to your computer and use it in GitHub Desktop.
Save dcb9/7de4abf45584ee60f616 to your computer and use it in GitHub Desktop.
四种比较常见的排序算法:插入,快速,选择,冒泡 以及测试程序
<?php
/**
* 排序算法
* 插入排序、快速排序、选择排序、冒泡排序
*
*/
class SortAlgorithm{
/**
* 插入排序
* 算法排序过程示例图: http://baike.baidu.com/picture/396887/396887/0/d57e99942da24e5dd21b7080?fr=lemma&ct=single#aid=0&pic=d57e99942da24e5dd21b7080
* @param array $arr 待排序的数组
* @param string $mode 'asc' 'desc'
*
*/
public function insertSort(array $arr, $mode='asc'){
$count = count($arr);
for ($i=1; $i<$count; $i++){
$j = $i-1;
$insertEle = $arr[$i];
while(array_key_exists($j, $arr) && self::getAgtBByMode($arr[$j], $insertEle, $mode)){
$arr[$j+1] = $arr[$j];
$arr[$j] = $insertEle;
$j--;
}
}
return $arr;
}
public function bubbleSort(array $arr, $mode='asc'){
$count = count($arr);
for($i=0; $i<$count; $i++){
for($j=0;$j<$count-1-$i; $j++){
if(self::getAgtBByMode($arr[$j], $arr[$j+1], $mode)){
$tmp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
/**
* 选择排序
* http://baike.baidu.com/view/547263.htm
*/
public function selectSort(array $arr, $mode='asc'){
$count = count($arr);
for ($i=0; $i<$count-1; $i++){
$k = $i;
for($j=$i+1; $j<$count; $j++){
if(self::getAgtBByMode($arr[$k], $arr[$j], $mode)){
$k=$j;
}
}
if($k!=$i){
$tmp = $arr[$k];
$arr[$k] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
/**
*
*
* http://baike.baidu.com/picture/19016/19016/0/574e9258d109b3dee4ddfa6acfbf6c81800a4c55?fr=lemma&ct=single#aid=0&pic=574e9258d109b3dee4ddfa6acfbf6c81800a4c55
*
*/
public function quickSort(array $arr, $mode='asc'){
if(count($arr)>1){
$key=$arr[0];
$left=$right=array();
$_size=count($arr);
for($i=1;$i<$_size;$i++){
if(self::getAgtBByMode($key, $arr[$i], $mode)){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
$left=self::quickSort($left, $mode);
$right=self::quickSort($right, $mode);
return array_merge($left,array($key),$right);
}else{
return $arr;
}
}
/**
* 比较两个数的大小,根据$mode的值来返回 true 或 false.
*
* 若传入的 $mode = asc 则 $a > $b 返回 true
* 若 $mode = desc 则 $a < $b 返回true
* 反之则返回 false
*
* @param int $a
* @param int $b
* @param string $mode asc desc
* @return boolean
*/
protected static function getAgtBByMode($a, $b, $mode='asc'){
$a = (int)$a;
$b = (int)$b;
return $mode == 'asc' ? $a > $b : $a < $b;
}
}
<?php
include __DIR__.'/../src/SortAlgorithm.php';
class SortAlgorithmTest extends PHPUnit_Framework_TestCase{
protected $originalArr = array(77, 10, 77, 20, 30, 79, 22, 21,9, 100,50,43,21,89);
protected $expectASCArr = array(9, 10, 20, 21, 21, 22, 30, 43, 50, 77, 77, 79, 89, 100);
protected $expectDESCArr = array(100, 89, 79, 77, 77, 50, 43,30, 22, 21, 21, 20, 10, 9);
protected $SortAlgorithm = null;
public function setUp(){
if($this->SortAlgorithm===null){
$this->SortAlgorithm = new SortAlgorithm;
}
}
public function tearDown(){
$this->SortAlgorithm = null;
}
public function testBubbleSort(){
$originalArr = $this->originalArr;
shuffle($originalArr);
$this->assertEquals($this->expectASCArr
, $this->SortAlgorithm->bubbleSort($originalArr, 'asc'));
$this->assertEquals($this->expectDESCArr
, $this->SortAlgorithm->bubbleSort($originalArr, 'desc'));
}
public function testInsertSort(){
$originalArr = $this->originalArr;
// 每次在进行排序之前,将原始数据打扰之后进行测试
shuffle($originalArr);
$this->assertEquals($this->expectASCArr
, $this->SortAlgorithm->insertSort($originalArr, 'asc'));
$this->assertEquals($this->expectDESCArr
, $this->SortAlgorithm->insertSort($originalArr, 'desc'));
}
public function testSelectSort(){
$originalArr = $this->originalArr;
// 每次在进行排序之前,将原始数据打扰之后进行测试
shuffle($originalArr);
$this->assertEquals($this->expectASCArr
, $this->SortAlgorithm->selectSort($originalArr, 'asc'));
$this->assertEquals($this->expectDESCArr
, $this->SortAlgorithm->selectSort($originalArr, 'desc'));
}
public function testQuickSort(){
$originalArr = $this->originalArr;
// 每次在进行排序之前,将原始数据打扰之后进行测试
shuffle($originalArr);
$this->assertEquals($this->expectASCArr
, $this->SortAlgorithm->quickSort($originalArr, 'asc'));
$this->assertEquals($this->expectDESCArr
, $this->SortAlgorithm->quickSort($originalArr, 'desc'));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment