当前位置:Gxlcms > PHP教程 > 关于冒泡,二分法插入,快速排序算法的介绍

关于冒泡,二分法插入,快速排序算法的介绍

时间:2021-07-01 10:21:17 帮助过:4人阅读

1.冒泡排序算法
过程:

1.遍历整个数组,每两两相邻的元素进行比较,如$a[$i]>$a[$i+1]则互换位置,每次比较消除一个逆序。
2.每一次循环后,下次再需要循环的次数减少1。

  1. <?php
  2. // 冒泡排序
  3. $arr = createarr(20);
  4. printarr($arr);
  5. popsort($arr);
  6. printarr($arr);
  7. function createarr($num=10){
  8. $arr = array();
  9. for($i=0; $i<$num; $i++){
  10. array_push($arr, mt_rand(0,999));
  11. }
  12. return $arr;
  13. }
  14. function printarr($arr){
  15. echo 'arr:'.implode(',', $arr).'<br>';
  16. }
  17. function popsort(&$arr){
  18. for($i=0,$length=count($arr)-1; $i<$length; $i++){
  19. for($j=0; $j<$length-$i; $j++){
  20. if($arr[$j]>$arr[$j+1]){
  21. $tmp = $arr[$j];
  22. $arr[$j] = $arr[$j+1];
  23. $arr[$j+1] = $tmp;
  24. }
  25. }
  26. }
  27. }
  28. ?>

2.二分法插入排序

过程:
1.首先,原数组是一个有序序列,$low=0 $high=count($arr)-1。
2.将要插入的数与数组中间位置的元素进行比较,
如果比中间元素大,则$low=$mid+1作为下一次判断的数组开头。
如果比中间元素小,则$high=$mid-1作为下一次判断的数组结尾。
3.直到$low>$high结束,$low就是新元素插入的位置。
4.将数组中从$low开始的元素全部向后移动一位,之后在$low位置插入新元素。

  1. <?php
  2. // 二分法插入排序
  3. $arr = createarr(20);
  4. $key = mt_rand(0,99);
  5. printarr($arr);
  6. echo 'key='.$key.'<br>';
  7. binsort($arr, $key);
  8. printarr($arr);
  9. function createarr($num=10){
  10. $arr = array();
  11. for($i=0; $i<$num; $i++){
  12. array_push($arr, mt_rand(0,99));
  13. }
  14. sort($arr); // 有序序列
  15. return $arr;
  16. }
  17. function printarr($arr){
  18. echo 'arr:'.implode(',', $arr).'<br>';
  19. }
  20. function binsort(&$arr, $key){
  21. $low = 0;
  22. $high = count($arr)-1;
  23. while($low<=$high){
  24. $m = $low + (int)(($high-$low)/2);
  25. $mkey = $arr[$m];
  26. if($key>=$mkey){
  27. $low = $m + 1;
  28. }else{
  29. $high = $m - 1;
  30. }
  31. }
  32. // 移动插入位置之后的元素,插入新元素
  33. for($i=count($arr)-1; $i>=$low; $i--){
  34. $arr[$i+1] = $arr[$i];
  35. }
  36. $arr[$low] = $key;
  37. }
  38. ?>

3.快速排序
过程:

1. 在数组中找一个元素作为key,一般取数组第一个元素作为key
2. i=0, j=数组长度-1
3. j-- 当 arr[j]<key, arr[i]与arr[j]交换位置
4. i++ 当 arr[i]>key, arr[i]与arr[j]交换位置
5. 重复3,4 直到 i==j 时,完成。
6. 将key分隔的左右两组元素再分别执行 1,2,3,4,5 (递归)。

  1. <?php
  2. // 快速排序
  3. $arr = createarr(20);
  4. printarr($arr);
  5. quicksort($arr, 0, count($arr)-1);
  6. printarr($arr);
  7. function createarr($num=10){
  8. $arr = array();
  9. for($i=0; $i<$num; $i++){
  10. array_push($arr, mt_rand(0,999));
  11. }
  12. return $arr;
  13. }
  14. function printarr($arr){
  15. echo 'arr:'.implode(',', $arr).'<br>';
  16. }
  17. function quicksort(&$arr, $low, $high){
  18. if($low>=$high){
  19. return ;
  20. }
  21. $key = $arr[$low];
  22. $i = $low;
  23. $j = $high;
  24. $flag = 1;
  25. while($i!=$j){
  26. switch($flag){
  27. case 0:
  28. if($arr[$i]>$key){
  29. $tmp = $arr[$i];
  30. $arr[$i] = $arr[$j];
  31. $arr[$j] = $tmp;
  32. $flag = 1;
  33. }else{
  34. $i++;
  35. }
  36. break;
  37. case 1:
  38. if($arr[$j]<$key){
  39. $tmp = $arr[$i];
  40. $arr[$i] = $arr[$j];
  41. $arr[$j] = $tmp;
  42. $flag = 0;
  43. }else{
  44. $j--;
  45. }
  46. break;
  47. }
  48. }
  49. quicksort($arr, $low, $i-1);
  50. quicksort($arr, $i+1, $high);
  51. }
  52. ?>

本篇文章讲解了于冒泡,二分法插入,快速排序算法,更多相关内容请关注Gxl网。

相关推荐:

如何通过php 过滤html标记属性类

如何使用php 替换敏感字符串的相关操作

关于PHP 遍历文件夹及文件类及处理类

以上就是关于冒泡,二分法插入,快速排序算法的介绍的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行