免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2174 | 回复: 0
打印 上一主题 下一主题

PHP实现各种排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-24 14:15 |只看该作者 |倒序浏览
PHP实现各种排序







Php代码
  1. 1.<?php   
  2. 2./**  
  3. 3. * 各种排序  
  4. 4. * @author zhaojaingwei  
  5. 5. * @since 2011/11/21 16:14  
  6. 6. *  
  7. 7. */  
  8. 8.  
  9. 9.$list = array(3,5,1,2,10,8,15,19,20);   
  10. 10.  
  11. 11.//快排   
  12. 12.function fast(&$list, $low, $high){   
  13. 13.    if($high - $low > 5){   
  14. 14.        while($low < $high){   
  15. 15.            $key = excute($list, $low, $high);   
  16. 16.            fast($list, $low, $key - 1);   
  17. 17.            //fast($list, $key + 1, $high);//普通递归实现   
  18. 18.            $low = $key + 1;//尾递归实现   
  19. 19.        }   
  20. 20.    }else{   
  21. 21.        insert($list);   
  22. 22.    }   
  23. 23.}   
  24. 24.  
  25. 25.//快排执行一次排序   
  26. 26.function excute(&$list, $low, $high){   
  27. 27.    swap($list, $low, ($low + $high)/2);   
  28. 28.    $temp = $list[$low];   
  29. 29.    while($low < $high){   
  30. 30.        while($low < $high && $list[$high] > $temp){   
  31. 31.            $high --;   
  32. 32.        }   
  33. 33.  
  34. 34.        $list[$low] = $list[$high];   
  35. 35.  
  36. 36.        while($low < $high && $list[$low] < $temp){   
  37. 37.            $low ++;   
  38. 38.        }   
  39. 39.           
  40. 40.        $list[$high] = $list[$low];   
  41. 41.    }   
  42. 42.  
  43. 43.    $list[$low] = $temp;   
  44. 44.  
  45. 45.    return $low;   
  46. 46.}   
  47. 47.  
  48. 48.//堆排序   
  49. 49.function heap(&$list){   
  50. 50.    buildHeap($list);   
  51. 51.    for($i = count($list) - 1; $i > 0; $i --){   
  52. 52.        swap($list, $i, 0);   
  53. 53.        heapfy($list, 0, $i - 1);   
  54. 54.    }   
  55. 55.}   
  56. 56.  
  57. 57.//创建堆   
  58. 58.function buildHeap(&$list){   
  59. 59.    for($i = (count($list) - 2)/2; $i >= 0; $i --){   
  60. 60.         heapfy($list, $i, count($list) - 1);     
  61. 61.    }   
  62. 62.}   
  63. 63.  
  64. 64.//维护堆   
  65. 65.function heapfy(&$list, $low, $high){   
  66. 66.    $temp = $list[$low];   
  67. 67.  
  68. 68.    for($i = ($low * 2 + 1); $i <= $high; $i = ($i * 2 + 1)){   
  69. 69.        if($i < $high && $list[$i] < $list[$i + 1]){   
  70. 70.            $i ++;      
  71. 71.        }   
  72. 72.  
  73. 73.        if($temp < $list[$i]){   
  74. 74.            swap($list, $i, $low);   
  75. 75.            $low = $i;   
  76. 76.        }else{   
  77. 77.            break;   
  78. 78.        }   
  79. 79.  
  80. 80.    }   
  81. 81.  
  82. 82.    $list[$low] = $temp;   
  83. 83.}   
  84. 84.  
  85. 85.//希尔排序   
  86. 86.function shell(&$list){   
  87. 87.    $a = 0;   
  88. 88.    $code = count($list)/3 + 1;   
  89. 89.    while($code >= 1){   
  90. 90.        for($i = $code; $i < count($list); $i ++){   
  91. 91.            $a ++;   
  92. 92.            if($list[$i] < $list[$i - $code]){   
  93. 93.                $temp = $list[$i];   
  94. 94.                $list[$i] = $list[$i - $code];   
  95. 95.                $j = $i - 2*$code;   
  96. 96.                  
  97. 97.                for(; $j >= 0 && $list[$j] > $temp; $j -= $code){   
  98. 98.                    $list[$j + $code] = $list[$j];   
  99. 99.                    $a ++;   
  100. 100.                }   
  101. 101.                $list[$j + $code] = $temp;   
  102. 102.            }   
  103. 103.        }   
  104. 104.  
  105. 105.        $code = $code/3;   
  106. 106.    }   
  107. 107.  
  108. 108.    echo $a;   
  109. 109.}   
  110. 110.  
  111. 111.//直接插入排序   
  112. 112.function insert(&$list){   
  113. 113.    $a = 0;   
  114. 114.    for($i = 1; $i < count($list); $i ++){   
  115. 115.        $a ++;   
  116. 116.        if($list[$i] < $list[$i - 1]){   
  117. 117.            $temp = $list[$i];   
  118. 118.            $list[$i] = $list[$i - 1];   
  119. 119.               
  120. 120.            $j = $i - 2;   
  121. 121.            for(; $list[$j] > $temp; $j --){   
  122. 122.                $a ++;   
  123. 123.                $list[$j + 1] = $list[$j];   
  124. 124.            }   
  125. 125.               
  126. 126.            $list[$j + 1] = $temp;   
  127. 127.        }   
  128. 128.    }   
  129. 129.  
  130. 130.    echo $a;   
  131. 131.}   
  132. 132.  
  133. 133.//简单选择排序   
  134. 134.function select(&$list){   
  135. 135.    $a = 0;   
  136. 136.    for($i = 0; $i < count($list); $i ++){   
  137. 137.        $min = $i;   
  138. 138.        $a ++;   
  139. 139.        for($j = $i + 1; $j < count($list); $j ++){   
  140. 140.            $a ++;   
  141. 141.            if($list[$j] < $list[$min]){   
  142. 142.                $min = $j;   
  143. 143.            }   
  144. 144.        }   
  145. 145.      
  146. 146.        if($min != $i)   
  147. 147.            swap($list, $i, $min);   
  148. 148.    }   
  149. 149.    echo $a;   
  150. 150.}   
  151. 151.  
  152. 152.//冒泡排序   
  153. 153.function bubble(&$list){   
  154. 154.    $swap = TRUE;   
  155. 155.    $a = 0;   
  156. 156.    for($i = 0; $i < count($list) && $swap; $i ++){   
  157. 157.        $swap = FALSE;   
  158. 158.        $a ++;   
  159. 159.        for($j = count($list) - 2; $j >= $i; $j --){   
  160. 160.            $a ++;   
  161. 161.            if($list[$j] > $list[$j + 1]){   
  162. 162.                $swap = TRUE;   
  163. 163.                swap($list, $j, $j + 1);   
  164. 164.            }   
  165. 165.        }   
  166. 166.    }   
  167. 167.    echo $a;   
  168. 168.}   
  169. 169.  
  170. 170.//移动或交换函数   
  171. 171.function swap(&$list, $i, $j){   
  172. 172.    $temp = $list[$i];   
  173. 173.    $list[$i] = $list[$j];   
  174. 174.    $list[$j] = $temp;   
  175. 175.}   
  176. 176.  
  177. 177.?>  
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP