详解php中的几种常见排序方法(附代码)

PHP有多种排序方法,本篇文章给大家介绍几种常见的排序方法:冒泡排序、交换法排序、选择法排序、插入法排序、快速排序。希望对大家有所帮助。

排序方法1:冒泡排序

  1. function BubbleSort($arr) {
  2. // 获得数组总长度
  3. $num = count($arr);
  4. // 正向遍历数组
  5. for ($i = 1; $i < $num; $i++) {
  6. // 反向遍历
  7. for ($j = $num - 1; $j >= $i ; $j--) {
  8. // 相邻两个数比较
  9. if ($arr[$j] < $arr[$j-1]) {
  10. // 暂存较小的数
  11. $iTemp = $arr[$j-1];
  12. // 把较大的放前面
  13. $arr[$j-1] = $arr[$j];
  14. // 较小的放后面
  15. $arr[$j] = $iTemp;
  16. }
  17. }
  18. }
  19. return $arr;
  20. }

排序方法2:交换法排序

  1. function ExchangeSort($arr){
  2. $num = count($arr);
  3. // 遍历数组
  4. for ($i = 0;$i < $num - 1; $i++) {
  5. // 获得当前索引的下一个索引
  6. for ($j = $i + 1; $j < $num; $j++) {
  7. // 比较相邻两个的值大小
  8. if ($arr[$j] < $arr[$i]) {
  9. // 暂存较小的数
  10. $iTemp = $arr[$i];
  11. // 把较大的放前面
  12. $arr[$i] = $arr[$j];
  13. // 较小的放后面
  14. $arr[$j] = $iTemp;
  15. }
  16. }
  17. }
  18. return $arr;
  19. }

排序方法3:选择法排序

  1. function SelectSort($arr) {
  2. // 获得数组总长度
  3. $num = count($arr);
  4. // 遍历数组
  5. for ($i = 0;$i < $num-1; $i++) {
  6. // 暂存当前值
  7. $iTemp = $arr[$i];
  8. // 暂存当前位置
  9. $iPos = $i;
  10. // 遍历当前位置以后的数据
  11. for ($j = $i + 1;$j < $num; $j++){
  12. // 如果有小于当前值的
  13. if ($arr[$j] < $iTemp) {
  14. // 暂存最小值
  15. $iTemp = $arr[$j];
  16. // 暂存位置
  17. $iPos = $j;
  18. }
  19. }
  20. // 把当前值放到算好的位置
  21. $arr[$iPos] = $arr[$i];
  22. // 把当前值换成算好的值
  23. $arr[$i] = $iTemp;
  24. }
  25. return $arr;
  26. }

排序方法4:插入法排序

  1. function InsertSort($arr){
  2. $num = count($arr);
  3. // 遍历数组
  4. for ($i = 1;$i < $num; $i++) {
  5. // 获得当前值
  6. $iTemp = $arr[$i];
  7. // 获得当前值的前一个位置
  8. $iPos = $i - 1;
  9. // 如果当前值小于前一个值切未到数组开始位置
  10. while (($iPos >= 0) && ($iTemp < $arr[$iPos])) {
  11. // 把前一个的值往后放一位
  12. $arr[$iPos + 1] = $arr[$iPos];
  13. // 位置递减
  14. $iPos--;
  15. }
  16. $arr[$iPos+1] = $iTemp;
  17. }
  18. return $arr;
  19. }

排序方法5:快速排序

  1. function QuickSort($arr){
  2. $num = count($arr);
  3. $l = $r = 0;
  4. $left = $right = array();
  5. // 从索引的第二个开始遍历数组
  6. for ($i = 1;$i < $num; $i++) {
  7. // 如果值小于索引1
  8. if ($arr[$i] < $arr[0]) {
  9. // 装入左索引数组(小于索引1的数据)
  10. $left[] = $arr[$i];
  11. $l++;
  12. } else {
  13. // 否则装入右索引中(大于索引1的数据)
  14. $right[] = $arr[$i];
  15. $r++; //
  16. }
  17. }
  18. // 如果左索引有值 则对左索引排序
  19. if($l > 1) {
  20. $left = QuickSort($left);
  21. }
  22. // 排序后的数组
  23. $new_arr = $left;
  24. // 将当前数组第一个放到最后
  25. $new_arr[] = $arr[0];
  26. // 如果又索引有值 则对右索引排序
  27. if ($r > 1) {
  28. $right = QuickSort($right);
  29. }
  30. // 根据右索引的长度再次增加数据
  31. for($i = 0;$i < $r; $i++) {
  32. $new_arr[] = $right[$i];
  33. }
  34. return $new_arr;
  35. }