经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现
来源:cnblogs  作者:陶士涵  时间:2018/9/25 20:37:54  对本文有异议
  1. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P1000000007取模的结果输出。 即输出P%1000000007
  2.  
  3. 1.数组归并排序
  4. 2.归并排序比较左右两个堆数组中的元素大小时,进行计数,倒着比较,因为左堆倒第一如果比右堆倒第一大,那么就比右堆的所有都大
  5. mergeSort
  6. if left<right
  7. mid=[(p+r)/2]
  8. mergeSort(arr,left,mid,temp)
  9. mergeSort(arr,mid+1,right,temp)
  10. merge(arr,left,mid,right,temp)
  11. merge(arr,left,mid,right,temp)
  12. i=mid
  13. j=right
  14. t=right
  15. while i<=mid && j<=right
  16. if arr[i<arr[j]
  17. temp[t--]=arr[i--]
  18. else
  19. count+=mid-i+1
  20. temp[t--]=arr[j--]
  21. while i<=mid
  22. temp[t--]=arr[i]
  23. while j<=right
  24. temp[t--]=arr[j]
  25. 临时数组重新复制回原数组
  1. function InversePairs($data)
  2. {
  3. $num=0;
  4. $temp=array();
  5. mergeSort($data,0,count($data)-1,$temp,$num);
  6. $num%=1000000007;
  7. return $num;
  8. }
  9. //1.利用分治法思想,递归的切分排序元素
  10. function mergeSort(&$A,$left,$right,$temp,&$num){
  11. //2.最左只能小于最右,等于的时候就一个元素,大于是不可能的
  12. if($left<$right){
  13. //3.获取中间的元素
  14. $mid=intval(($left+$right)/2);
  15. //4.递归左半区
  16. mergeSort($A,$left,$mid,$temp,$num);
  17. //5.递归右半区
  18. mergeSort($A,$mid+1,$right,$temp,$num);
  19. //6.合并两个有序数组为一个有序数组
  20. merge($A,$left,$mid,$right,$temp,$num);
  21. }
  22. }
  23. function merge(&$A,$left,$mid,$right,$temp,&$num){
  24. //7.左堆起始
  25. $i=$left;
  26. //8.右堆起始
  27. $j=$mid+1;
  28. //9.临时数组起始
  29. $t=0;
  30. //10.左右堆数组都没到末尾
  31. while($i<=$mid && $j<=$right){
  32. //11.左堆小于等于右堆时
  33. if($A[$i]<$A[$j]){
  34. //12.左堆赋给临时数组,索引加1
  35. $temp[$t++]=$A[$i++];
  36. }else{
  37. $num+=$mid-$i+1;
  38. //13.右堆赋给临时数组,索引加1
  39. $temp[$t++]=$A[$j++];
  40. }
  41. }
  42. //14.左堆剩余的全部加进临时数组
  43. while($i<=$mid){
  44. $temp[$t++]=$A[$i++];
  45. }
  46. //15.右堆剩余全部加进临时数组
  47. while($j<=$right){
  48. $temp[$t++]=$A[$j++];
  49. }
  50. //16.临时数组的元素重新赋回原数组
  51. for($i=0;$i<$t;$i++){
  52. $A[$left+$i]=$temp[$i];
  53. }
  54. }
  55. $A=[364,637,341,406,747,995,234,971,571,219,993,407,416,366,315,301,601,650,418,355,460,505,360,965,516,648,727,667,465,849,455,181,486,149,588,233,144,174,557,67,74
  56. 6,550,474,162,268,142,463,221,882,576,604,739,288,569,256,936,275,401,497,82,935,983,583,523,697,478,147,795,380,973,958,115,773,870,259,655,446,863,735,784,3,671,43
  57. 3,630,425,930,64,266,235,187,284,665,874,80,45,848,38,811,267,575];
  58. $m=InversePairs($A);
  59. var_dump($m);

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号