Last active
August 29, 2015 14:08
-
-
Save dcb9/7de4abf45584ee60f616 to your computer and use it in GitHub Desktop.
四种比较常见的排序算法:插入,快速,选择,冒泡 以及测试程序
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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