四種排序算法的PHP實(shí)現(xiàn):
創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為廣豐企業(yè)提供專業(yè)的網(wǎng)站制作、做網(wǎng)站,廣豐網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1)?插入排序(Insertion?Sort)的基本思想是:?
每次將一個(gè)待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當(dāng)位置,直到全部記錄插入完成為止。
2)?選擇排序(Selection?Sort)的基本思想是:?
每一趟從待排序的記錄中選出關(guān)鍵字最小的記錄,順序放在已排好序的子文件的最后,直到全部記錄排序完畢。
3)?冒泡排序的基本思想是:?
兩兩比較待排序記錄的關(guān)鍵字,發(fā)現(xiàn)兩個(gè)記錄的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的記錄為止。
4)?快速排序?qū)嵸|(zhì)上和冒泡排序一樣,都是屬于交換排序的一種應(yīng)用。所以基本思想和上面的冒泡排序是一樣的。
1.?sort.php文件如下:
?php
class?Sort?{
private?$arr??=?array();?
private?$sort??=?'insert';
private?$marker?=?'_sort';
private?$debug?=?TRUE;
/**
*?構(gòu)造函數(shù)
*
*?@param??array??例如:
$config?=?array?(
'arr'?=?array(22,3,41,18)?,?//需要排序的數(shù)組值
'sort'?=?'insert',?//可能值:?insert,?select,?bubble,?quick
'debug'?=?TRUE?//可能值:?TRUE,?FALSE
)
*/
public?function?construct($config?=?array())?{
if?(?count($config)??0)?{
$this-_init($config);
}
}
/**
*?獲取排序結(jié)果
*/
public?function?display()?{
return?$this-arr;
}
/**
*?初始化
*
*?@param??array
*?@return?bool
*/
private?function?_init($config?=?array())?{
//參數(shù)判斷
if?(?!is_array($config)?OR?count($config)?==?0)?{
if?($this-debug?===?TRUE)?{
$this-_log("sort_init_param_invaild");
}
return?FALSE;
}
//初始化成員變量
foreach?($config?as?$key?=?$val)?{
if?(?isset($this-$key))?{
$this-$key?=?$val;
}
}
//調(diào)用相應(yīng)的成員方法完成排序
$method?=?$this-sort?.?$this-marker;
if?(?!?method_exists($this,?$method))?{
if?($this-debug?===?TRUE)?{
$this-_log("sort_method_invaild");
}
return?FALSE;
}
if?(?FALSE?===?($this-arr?=?$this-$method($this-arr)))
return?FALSE;
return?TRUE;
}
/**
*?插入排序
*?
*?@param??array
*?@return?bool
*/
private?function?insert_sort($arr)?{
//參數(shù)判斷
if?(?!?is_array($arr)?OR?count($arr)?==?0)?{
if?($this-debug?===?TRUE)?{
$this-_log("sort_array(insert)_invaild");
}
return?FALSE;
}
//具體實(shí)現(xiàn)
$count?=?count($arr);
for?($i?=?1;?$i??$count;?$i++)?{
$tmp?=?$arr[$i];
for($j?=?$i-1;?$j?=?0;?$j--)?{?
if($arr[$j]??$tmp)?{
$arr[$j+1]?=?$arr[$j];
$arr[$j]?=?$tmp;
}
}
}
return?$arr;
}
/**
*?選擇排序
*?
*?@param??array
*?@return?bool
*/
private?function?select_sort($arr)?{
//參數(shù)判斷
if?(?!?is_array($arr)?OR?count($arr)?==?0)?{
if?($this-debug?===?TRUE)?{
$this-_log("sort_array(select)_invaild");
}
return?FALSE;
}
//具體實(shí)現(xiàn)
$count?=?count($arr);
for?($i?=?0;?$i??$count-1;?$i++)?{
$min?=?$i;
for?($j?=?$i+1;?$j??$count;?$j++)?{
if?($arr[$min]??$arr[$j])?$min?=?$j;
}
if?($min?!=?$i)?{
$tmp?=?$arr[$min];
$arr[$min]?=?$arr[$i];
$arr[$i]?=?$tmp;
}
}
return?$arr;
}
/**
*?冒泡排序
*?
*?@param??array
*?@return?bool
*/
private?function?bubble_sort($arr)?{
//參數(shù)判斷
if?(?!?is_array($arr)?OR?count($arr)?==?0)?{
if?($this-debug?===?TRUE)?{
$this-_log("sort_array(bubble)_invaild");
}
return?FALSE;
}
//具體實(shí)現(xiàn)
$count?=?count($arr);
for?($i?=?0;?$i??$count;?$i++)?{
for?($j?=?$count-1;?$j??$i;?$j--)?{
if?($arr[$j]??$arr[$j-1])?{
$tmp?=?$arr[$j];
$arr[$j]?=?$arr[$j-1];
$arr[$j-1]?=?$tmp;
}
}
}
return?$arr;??
}
/**
*?快速排序
*?@by?
*?@param??array
*?@return?bool
*/
private?function?quick_sort($arr)?{
//具體實(shí)現(xiàn)
if?(count($arr)?=?1)?return?$arr;?
$key?=?$arr[0];
$left_arr?=?array();
$right_arr?=?array();
for?($i?=?1;?$i??count($arr);?$i++){
if?($arr[$i]?=?$key)
$left_arr[]?=?$arr[$i];
else
$right_arr[]?=?$arr[$i];
}
$left_arr?=?$this-quick_sort($left_arr);
$right_arr?=?$this-quick_sort($right_arr);?
return?array_merge($left_arr,?array($key),?$right_arr);
}
/**
*?日志記錄
*/
private?function?_log($msg)?{
$msg?=?'date['?.?date('Y-m-d?H:i:s')?.?']?'?.?$msg?.?'\n';
return?@file_put_contents('sort_err.log',?$msg,?FILE_APPEND);
}
}
/*End?of?file?sort.php*/
/*Location?htdocs/sort.php?*/
2.?sort_demo.php文件如下:
?php
require_once('sort.php');
$config?=?array?(
'arr'?=?array(23,?22,?41,?18,?20,?12,?200303,2200,1192)?,
//需要排序的數(shù)組值
'sort'?=?'select',
//可能值:?insert,?select,?bubble,?quick
'debug'?=?TRUE
//可能值:?TRUE,?FALSE
);
$sort?=?new?Sort($config);
//var_dump($config['arr']);
var_dump($sort-display());
/*End?of?php*/
本文實(shí)例講述了php數(shù)組遍歷類與用法。分享給大家供大家參考,具體如下:
?php
class
scanArray{
public
$arr;
public
$where;
private
$str;
public
function
scan($arr,$where="array"){
$this-arr
=
$arr;
$this-where
=
$where;
foreach($this-arr
as
$k=$v){
if(is_array($v)){
$this-where
=
($this-where)."[{$k}]";
$this-scan($v,$this-where);
}else{
$this-str
.=
$this-where."[{$k}]=".$v.'br
/';
}
}
return
$this-str;
}
function
__destruct(){
unset($this-arr);
unset($this-where);
}
}
$a
=
array('g'="a",'vv'=array("b"="b","l"="c","xx"=array("e","g")));
$ah
=
new
scanArray();
$b
=
$ah-scan($a);
echo
$b;
運(yùn)行結(jié)果:
array[g]=a
array[vv][b]=b
array[vv][l]=c
array[vv][xx][0]=e
array[vv][xx][1]=g
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)組(Array)操作技巧大全》、《php排序算法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》、《php字符串(string)用法總結(jié)》及《PHP常用遍歷算法與技巧總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:PHP遍歷數(shù)組的方法匯總PHP
數(shù)組遍歷方法大全(foreach,list,each)PHP
數(shù)組遍歷foreach語(yǔ)法結(jié)構(gòu)及實(shí)例PHP中多維數(shù)組的foreach遍歷示例php實(shí)現(xiàn)遍歷多維數(shù)組的方法PHP中使用foreach()遍歷二維數(shù)組的簡(jiǎn)單實(shí)例PHP遍歷數(shù)組的三種方法及效率對(duì)比分析PHP實(shí)現(xiàn)的操作數(shù)組類庫(kù)定義與用法示例PHP數(shù)組操作類實(shí)例PHP數(shù)組生成XML格式數(shù)據(jù)的封裝類實(shí)例
插入排序(Insertion Sort) 是一種較穩(wěn)定 簡(jiǎn)單直觀的排序算法 插入排序的工作原理 是通過(guò)構(gòu)建有序序列 對(duì)于未排序的數(shù)據(jù) 在有序序列中從后向前掃描 找到合適的位置并將其插入 插入排序 在最好情況下 時(shí)間復(fù)雜度為O(n);在最壞情況下 時(shí)間復(fù)雜度為O(n );平均時(shí)間復(fù)雜度為O(n )
插入排序示例圖
/**
* 數(shù)據(jù)結(jié)構(gòu)與算法(PHP實(shí)現(xiàn)) - 插入排序(Insertion Sort)。Tw.WiNGwit
*
* @author 創(chuàng)想編程(TOPPHP.ORG)
* @copyright Copyright (c) 2013 創(chuàng)想編程(TOPPHP.ORG) All Rights Reserved
* @license /licenses/mit-license.php MIT LICENSE
* @version 1.0.0 - Build20130613
*/
class InsertionSort {
/**
* 需要排序的數(shù)據(jù)數(shù)組。
*
* @var array
*/
private $data;
/**
* 數(shù)據(jù)數(shù)組的長(zhǎng)度。
*
* @var integer
*/
private $size;
/**
* 數(shù)據(jù)數(shù)組是否已排序。
*
* @var boolean
*/
private $done;
/**
* 構(gòu)造方法 - 初始化數(shù)據(jù)。
*
* @param array $data 需要排序的數(shù)據(jù)數(shù)組。
*/
public function __construct(array $data) {
$this-data = $data;
$this-size = count($this-data);
$this-done = FALSE;
}
/**
* 插入排序。
*/
private function sort() {
$this-done = TRUE;
for ($i = 1; $i $this-size; ++$i) {
$current = $this-data[$i];
if ($current $this-data[$i - 1]) {
for ($j = $i - 1; $j = 0 $this-data[$j] $current; --$j) {
$this-data[$j + 1] = $this-data[$j];
}
$this-data[$j + 1] = $current;
}
}
}
/**
* 獲取排序后的數(shù)據(jù)數(shù)組。
*
* @return array 返回排序后的數(shù)據(jù)數(shù)組。
*/
public function getResult() {
if ($this-done) {
return $this-data;
}
$this-sort();
return $this-data;
}
}
?
示例代碼 1
2
3
4
$insertion = new InsertionSort(array(9, 1, 5, 3, 2, 8, 6));
echo '
', print_r($insertion-getResult(), TRUE), '
'; lishixinzhi/Article/program/PHP/201311/20783