Home > Backend Development > PHP Tutorial > Detailed explanation of the steps to implement the merge sort algorithm in PHP

Detailed explanation of the steps to implement the merge sort algorithm in PHP

php中世界最好的语言
Release: 2023-03-26 06:06:02
Original
1266 people have browsed it

This time I will bring you a detailed explanation of the steps to implement the merge sort algorithm in PHP. What are the precautions for PHP to implement the merge sort algorithm? The following is a practical case, let's take a look.

Basic idea:

Merge sort: It is a sorting method implemented using the idea of ​​​​merging (merging). Its principle is that assuming that the initial sequence contains n elements, it can be regarded as n ordered subsequences, each subsequence has a length of 1, and then merged in pairs to obtain ⌈ n / 2⌉ (⌈ x ⌉ means not The smallest integer less than 2-way merge sort.

1. The process of merging:

a[i] takes the first part of array a (already sorted), a[j] takes the last part of array a Part (already sorted)

r array stores the sorted a array

Compare the sizes of a[i] and a[j], if a[i] ≤ a[j ], then copy the element a[i] in the first ordered list to r[k], and add 1 to i and k respectively; otherwise, copy the element a[j] in the second ordered list Copy it to r[k], and add 1 to j and k respectively. This cycle continues until one of the ordered lists is fetched, and then copies the remaining elements in the other ordered list to r from the subscript k to the element of subscript t. We usually use recursion to implement the merge sorting algorithm. First, divide the interval to be sorted [s, t] into two at the midpoint, then sort the left sub-range, then sort the right sub-range, and finally perform a merge operation on the left and right intervals. Merge into ordered intervals [s,t].

2. Merge operation:

Merge operation (merge), also called merging algorithm, refers to the method of merging two sequential sequences into one sequential sequence.

If there is a sequence {6, 202, 100, 301, 38, 8, 1}

Initial state: 6, 202, 100, 301, 38, 8, 1

After the first merge: {6,202}, {100,301}, {8,38}, {1}, number of comparisons: 3;

After the second merge: {6,100,202,301}, {1 ,8,38}, number of comparisons: 4;

After the third merge: {1,6,8,38,100,202,301}, number of comparisons: 4;

The total number of comparisons is: 3 4 4=11,;

The reverse number is 14;

3. Algorithm description:

The working principle of the merge operation is as follows:

Step 1: Apply for space so that its size is the sum of the two sorted sequences. This space is used to store the merged sequence

Step 2: Set two pointers, the initial position They are the starting positions of the two sorted sequences respectively

Step 3: Compare the elements pointed to by the two pointers, select the relatively small element and put it into the merge space, and move the pointer to the next position

Repeat step 3 until a pointer exceeds the end of the sequence

Copy all the remaining elements of the other sequence directly to the end of the merged sequence

Algorithm implementation:

Let’s take a look at the main function part first:

//交换函数
function swap(array &$arr,$a,$b){
  $temp = $arr[$a];
  $arr[$a] = $arr[$b];
  $arr[$b] = $temp;
}
//归并算法总函数
function MergeSort(array &$arr){
  $start = 0;
  $end = count($arr) - 1;
  MSort($arr,$start,$end);
}
Copy after login

In the total function, we only called one MSort() Function, because we want to use recursive calling, MSort() is encapsulated.

Let’s take a look at the MSort() function:

function MSort(array &$arr,$start,$end){
  //当子序列长度为1时,$start == $end,不用再分组
  if($start < $end){
    $mid = floor(($start + $end) / 2); //将 $arr 平分为 $arr[$start - $mid] 和 $arr[$mid+1 - $end]
    MSort($arr,$start,$mid);  //将 $arr[$start - $mid] 归并为有序的$arr[$start - $mid]
    MSort($arr,$mid + 1,$end);  //将 $arr[$mid+1 - $end] 归并为有序的 $arr[$mid+1 - $end]
    Merge($arr,$start,$mid,$end);    //将$arr[$start - $mid]部分和$arr[$mid+1 - $end]部分合并起来成为有序的$arr[$start - $end]
  }
}
Copy after login

The above MSort() function implements dividing the array in half and then in half ( until the subsequence length is 1), and then merge the subsequences.

Now is our merge operation function Merge() :

//归并操作
function Merge(array &$arr,$start,$mid,$end){
  $i = $start;
  $j=$mid + 1;
  $k = $start;
  $temparr = array();
  while($i!=$mid+1 && $j!=$end+1)
  {
    if($arr[$i] >= $arr[$j]){
      $temparr[$k++] = $arr[$j++];
    }
    else{
      $temparr[$k++] = $arr[$i++];
    }
  }
  //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中
  while($i != $mid+1){
    $temparr[$k++] = $arr[$i++];
  }
  //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中
  while($j != $end+1){
    $temparr[$k++] = $arr[$j++];
  }
  for($i=$start; $i<=$end; $i++){
    $arr[$i] = $temparr[$i];
  }
}
Copy after login

At this point, our merge algorithm is finished. Let’s try calling:

$arr = array(9,1,5,8,3,7,4,6,2);
MergeSort($arr);
var_dump($arr);
Copy after login

Running results:

array(9) {
 [0]=>
 int(1)
 [1]=>
 int(2)
 [2]=>
 int(3)
 [3]=>
 int(4)
 [4]=>
 int(5)
 [5]=>
 int(6)
 [6]=>
 int(7)
 [7]=>
 int(8)
 [8]=>
 int(9)
}
Copy after login

Complexity analysis:

Due to the merging algorithm, regardless of the original Whether the sequence is ordered or not, it will be grouped and compared, so its best, worst, and average time complexity are all O(nlogn).

The merge algorithm is a stable sorting algorithm.

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

Detailed explanation of PHP singleton mode use cases

php receivemail has the function of sending and receiving emails

The above is the detailed content of Detailed explanation of the steps to implement the merge sort algorithm in PHP. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template