首页 > 开发 > PHP > 正文

PHP排序算法类实例

2024-05-04 23:36:20
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了PHP排序算法类,实例分析了插入排序、选择排序、冒泡排序、快速排序等排序算法的原理与实现技巧,需要的朋友可以参考下

本文实例讲述了PHP排序算法类。分享给大家供大家参考。具体如下:

四种排序算法的PHP实现:

1) 插入排序(Insertion Sort)的基本思想是:

每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

2) 选择排序(Selection Sort)的基本思想是:

每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

3) 冒泡排序的基本思想是:

两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

1. sort.php文件如下:

 

 
  1. <?php 
  2. /** 
  3. *  
  4. * @author quanshuidingdang 
  5. */ 
  6. class Sort { 
  7. private $arr = array();  
  8. private $sort = 'insert'; 
  9. private $marker = '_sort'; 
  10. private $debug = TRUE; 
  11. /** 
  12. * 构造函数 
  13. * 
  14. * @param array 例如: 
  15. $config = array ( 
  16. 'arr' => array(22,3,41,18) , //需要排序的数组值 
  17. 'sort' => 'insert', //可能值: insert, select, bubble, quick 
  18. 'debug' => TRUE //可能值: TRUE, FALSE 
  19. ) 
  20. */ 
  21. public function __construct($config = array()) { 
  22. if ( count($config) > 0) { 
  23. $this->_init($config); 
  24. } 
  25. } 
  26. /** 
  27. * 获取排序结果 
  28. */ 
  29. public function display() { 
  30. return $this->arr; 
  31. } 
  32. /** 
  33. * 初始化 
  34. * 
  35. * @param array 
  36. * @return bool 
  37. */ 
  38. private function _init($config = array()) { 
  39. //参数判断 
  40. if ( !is_array($config) OR count($config) == 0) { 
  41. if ($this->debug === TRUE) { 
  42. $this->_log("sort_init_param_invaild"); 
  43. } 
  44. return FALSE; 
  45. } 
  46. //初始化成员变量 
  47. foreach ($config as $key => $val) { 
  48. if ( isset($this->$key)) { 
  49. $this->$key = $val; 
  50. } 
  51. } 
  52. //调用相应的成员方法完成排序 
  53. $method = $this->sort . $this->marker; 
  54. if ( ! method_exists($this, $method)) { 
  55. if ($this->debug === TRUE) { 
  56. $this->_log("sort_method_invaild"); 
  57. } 
  58. return FALSE; 
  59. } 
  60. if ( FALSE === ($this->arr = $this->$method($this->arr))) 
  61. return FALSE; 
  62. return TRUE; 
  63. } 
  64. /** 
  65. * 插入排序 
  66. *  
  67. * @param array 
  68. * @return bool 
  69. */ 
  70. private function insert_sort($arr) { 
  71. //参数判断 
  72. if ( ! is_array($arr) OR count($arr) == 0) { 
  73. if ($this->debug === TRUE) { 
  74. $this->_log("sort_array(insert)_invaild"); 
  75. } 
  76. return FALSE; 
  77. } 
  78. //具体实现 
  79. $count = count($arr); 
  80. for ($i = 1; $i < $count; $i++) { 
  81. $tmp = $arr[$i]; 
  82. for($j = $i-1; $j >= 0; $j--) {  
  83. if($arr[$j] > $tmp) { 
  84. $arr[$j+1] = $arr[$j]; 
  85. $arr[$j] = $tmp; 
  86. } 
  87. } 
  88. } 
  89. return $arr; 
  90. } 
  91. /** 
  92. * 选择排序 
  93. *  
  94. * @param array 
  95. * @return bool 
  96. */ 
  97. private function select_sort($arr) { 
  98. //参数判断 
  99. if ( ! is_array($arr) OR count($arr) == 0) { 
  100. if ($this->debug === TRUE) { 
  101. $this->_log("sort_array(select)_invaild"); 
  102. } 
  103. return FALSE; 
  104. } 
  105. //具体实现 
  106. $count = count($arr); 
  107. for ($i = 0; $i < $count-1; $i++) { 
  108. $min = $i; 
  109. for ($j = $i+1; $j < $count; $j++) { 
  110. if ($arr[$min] > $arr[$j]) $min = $j; 
  111. } 
  112. if ($min != $i) { 
  113. $tmp = $arr[$min]; 
  114. $arr[$min] = $arr[$i]; 
  115. $arr[$i] = $tmp; 
  116. } 
  117. } 
  118. return $arr; 
  119. } 
  120. /** 
  121. * 冒泡排序 
  122. *  
  123. * @param array 
  124. * @return bool 
  125. */ 
  126. private function bubble_sort($arr) { 
  127. //参数判断 
  128. if ( ! is_array($arr) OR count($arr) == 0) { 
  129. if ($this->debug === TRUE) { 
  130. $this->_log("sort_array(bubble)_invaild"); 
  131. } 
  132. return FALSE; 
  133. } 
  134. //具体实现 
  135. $count = count($arr); 
  136. for ($i = 0; $i < $count; $i++) { 
  137. for ($j = $count-1; $j > $i; $j--) { 
  138. if ($arr[$j] < $arr[$j-1]) { 
  139. $tmp = $arr[$j]; 
  140. $arr[$j] = $arr[$j-1]; 
  141. $arr[$j-1] = $tmp; 
  142. } 
  143. } 
  144. } 
  145. return $arr;  
  146. } 
  147. /** 
  148. * 快速排序 
  149. *  
  150. * @param array 
  151. * @return bool 
  152. */ 
  153. private function quick_sort($arr) { 
  154. //具体实现 
  155. if (count($arr) <= 1) return $arr;  
  156. $key = $arr[0]; 
  157. $left_arr = array(); 
  158. $right_arr = array(); 
  159. for ($i = 1; $i < count($arr); $i++){ 
  160. if ($arr[$i] <= $key) 
  161. $left_arr[] = $arr[$i]; 
  162. else 
  163. $right_arr[] = $arr[$i]; 
  164. } 
  165. $left_arr = $this->quick_sort($left_arr); 
  166. $right_arr = $this->quick_sort($right_arr);  
  167.  
  168. return array_merge($left_arr, array($key), $right_arr); 
  169. } 
  170. /** 
  171. * 日志记录 
  172. */ 
  173. private function _log($msg) { 
  174. $msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '/n'; 
  175. return @file_put_contents('sort_err.log', $msg, FILE_APPEND); 
  176. } 
  177. } 
  178. /*End of file sort.php*/ 
  179. /*Location htdocs/sort.php */ 

2. sort_demo.php文件如下:

 

 
  1. <?php 
  2. require_once('sort.php'); 
  3. $config = array ( 
  4. 'arr' => array(23, 22, 41, 18, 20, 12, 200303,2200,1192) , 
  5. //需要排序的数组值 
  6. 'sort' => 'select', 
  7. //可能值: insert, select, bubble, quick 
  8. 'debug' => TRUE 
  9. //可能值: TRUE, FALSE 
  10. ); 
  11. $sort = new Sort($config); 
  12. //var_dump($config['arr']); 
  13. var_dump($sort->display()); 
  14. /*End of php*/ 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表