function mergeSort($list) { $length = count($list); $res = []; if ($length > 1) { $chunks = array_chunk($list, ceil($length / 2)); $firstChunk = mergeSort($chunks[0]); $secondChunk = mergeSort($chunks[1]); $i = 0; $j = 0; while ($i < count($firstChunk)) { if ($firstChunk[$i] > $secondChunk[$j]) { $res[] = $secondChunk[$j]; $j++; } else { if ($firstChunk[$i] < $secondChunk[$j]) { $res[] = $firstChunk[$i]; $i++; } } if (!array_key_exists($i, $firstChunk)) { $res = array_merge($res, array_slice($secondChunk, $j, count($secondChunk))); break; } if (!array_key_exists($j, $secondChunk)) { $res = array_merge($res, array_slice($firstChunk, $i, count($firstChunk))); break; } } } else { return $list; } return $res; }
function mergeSort(array &$a, $first, $last, $temp) { if ($first < $last) { $mid = (int) (($first + $last) / 2); mergeSort($a, $first, $mid, $temp); mergeSort($a, $mid + 1, $last, $temp); mergeArray($a, $first, $mid, $last, $temp); } }
function mergeSort($array) { if (count($array) < 2) { return $array; } $mid = count($array) / 2; echo "<h5>Splitting " . json_encode($array) . " ===> Left: " . json_encode(array_slice($array, 0, $mid)) . " Right: " . json_encode(array_slice($array, $mid)); $right = mergeSort(array_slice($array, 0, $mid)); $left = mergeSort(array_slice($array, $mid)); return merge($left, $right); }
function mergeSort(array $arr) { $count = count($arr); if ($count <= 1) { return $arr; } $left = array_slice($arr, 0, (int) ($count / 2)); $right = array_slice($arr, (int) ($count / 2)); $left = mergeSort($left); $right = mergeSort($right); return merge($left, $right); }
function mergeSort($array) { if (count($array) < 2) { return $array; } if (count($array) < 3) { echo "<h5>Splitting " . json_encode($array) . " ===>" . " Part #1: " . json_encode(array($array[0])) . " Part #2: " . json_encode(array($array[1])); return merge(array($array[0]), array($array[1])); } $part = (int) (count($array) / 3); echo "<h5>Splitting " . json_encode($array) . " ===>" . " Part #1: " . json_encode(array_slice($array, 0, $part)) . " Part #2: " . json_encode(array_slice($array, $part, $part)) . " Part #3: " . json_encode(array_slice($array, $part * 2)); return merge(mergeSort(array_slice($array, 0, $part)), mergeSort(array_slice($array, $part, $part)), mergeSort(array_slice($array, $part * 2))); }
function mergeSort(&$list, $first, $last) { if ($first < $last) { //実施条件(分割できる事。)これがないと再帰が終わらない。 $center = intval(($first + $last) / 2); $p = 0; $j = 0; $k = $first; $tmp = null; //待避配列 //前半部分をソートする mergeSort($list, $first, $center); //後半部分をソートする mergeSort($list, $center + 1, $last); //ここから前半部分と後半部分を比較して一つにする //ソート済みの前半部分を待避配列に全て保存する for ($i = $first; $i <= $center; $i++) { $tmp[$p++] = $list[$i]; } //$iが対象配列の最後まで行って、$tmp配列を全て調べ終わるまで行う //$iは$center + 1から。つまり右側と左側($tmp)の比較 //$pも$center + 1。 //$jは0から //$kも0から (再帰で使う時は$first) while ($i <= $last && $j < $p) { if ($tmp[$j] <= $list[$i]) { //前半部分の配列が後半部分よりも小さい時 //そのまま対象配列に前半部分の値を保存 $list[$k] = $tmp[$j]; //ポインタは各々増やす $k++; $j++; } else { //後半部分のほうが小さい時 //対象配列に後半部分の値を入れる。 //前半部分の配列は$tmp配列にコピーしているので上書きでOK $list[$k] = $list[$i]; //ポインタを各々増やす $k++; $i++; } } //余っている待避配列があれば、全て並び替えの対象配列に追加する while ($j < $p) { $list[$k++] = $tmp[$j++]; } } }
function mergeSort(array $arr) { $arrCount = count($arr); if ($arrCount <= 1) { return $arr; } $firstHalf = mergeSort(array_slice($arr, 0, $arrCount / 2)); $secondHalf = mergeSort(array_slice($arr, $arrCount / 2)); $resultArr = []; while (!empty($firstHalf) && !empty($secondHalf)) { if ($firstHalf[0] <= $secondHalf[0]) { $resultArr[] = array_shift($firstHalf); } elseif ($secondHalf[0] < $firstHalf[0]) { $resultArr[] = array_shift($secondHalf); } } $resultArr = array_merge($resultArr, empty($firstHalf) ? $secondHalf : $firstHalf); return $resultArr; }
function mergeSort($arr) { if (count($arr) > 1) { $middleVal = floor(count($arr) / 2); $arr1 = mergeSort(array_slice($arr, 0, $middleVal)); $arr2 = mergeSort(array_slice($arr, $middleVal, count($arr))); $counter1 = $counter2 = 0; for ($i = 0; $i < count($arr); $i++) { if ($counter1 == count($arr1)) { $arr[$i] = $arr2[$counter2]; $counter2++; } elseif ($counter2 == count($arr2) or $arr1[$counter1] < $arr2[$counter2]) { $arr[$i] = $arr1[$counter1]; $counter1++; } else { $arr[$i] = $arr2[$counter2]; $counter2++; } } } return $arr; }
/** * Stable, good for linked list * can be implemented parallel * @param array $myArray */ function mergeSort(array $myArray) { if (count($myArray) < 2) { return $myArray; } else { if (count($myArray) === 2) { if ($myArray[0] > $myArray[1]) { return [$myArray[1], $myArray[0]]; } return $myArray; } } $midPoint = ceil(count($myArray) / 2); $firstArray = mergeSort(array_slice($myArray, 0, $midPoint)); $secondArray = mergeSort(array_slice($myArray, $midPoint, count($myArray))); $merged = []; while ($firstArray && $secondArray) { $firstVal = array_shift($firstArray); $secondVal = array_shift($secondArray); $first = $firstVal < $secondVal ? $firstVal : $secondVal; $second = $firstVal < $secondVal ? $secondVal : $firstVal; $last = end($merged); if ($first < $last) { list($merged[count($merged) - 1], $first) = [$first, $merged[count($merged) - 1]]; } $merged[] = $first; $merged[] = $second; } if ($firstArray) { $merged[] = array_shift($firstArray); } return $merged; }
/** * The famous merge sort algorithm implementation * * $data is an array formatted as follow (with $i as an index): * list($song_id, $usr_id, $country_code) = $data[$i]; * * @param $data, a multidimensional array containing the log data * @param $comparator1, the first comparator index (0: song_id, 1: usr_id, 2: country_code) * @param $comparator2, the second comparator index (0: song_id, 1: usr_id, 2: country_code) */ function mergeSort($data, $comparator1, $comparator2) { if (count($data) <= 1) { return $data; } $mid = count($data) / 2; $left = array_slice($data, 0, $mid); $right = array_slice($data, $mid); $left = mergeSort($left, $comparator1, $comparator2); $right = mergeSort($right, $comparator1, $comparator2); return merge($left, $right, $comparator1, $comparator2); }
function mergeSort(&$arr, $from, $end) { #切分数组直到数组元素只剩下一个 if ($from < $end) { $mid = floor(($from + $end) / 2); mergeSort($arr, $from, $mid); mergeSort($arr, $mid + 1, $end); #合并数组 $tempArr = array(); $leftInx = $from; $rightInx = $mid + 1; #合并左右两部,直到左边或右边部分全部排入临时数组 while ($leftInx <= $mid && $rightInx <= $end) { if ($arr[$leftInx] < $arr[$rightInx]) { $tempArr[] = $arr[$leftInx++]; } else { $tempArr[] = $arr[$rightInx++]; } } #处理没有排完的一部分的剩下元素,因为待合并的部分是有序数组,剩下的元素直接全部加入临时数组 while ($leftInx <= $mid) { $tempArr[] = $arr[$leftInx++]; } while ($rightInx <= $end) { $tempArr[] = $arr[$rightInx++]; } #用临时数组的值替换掉原数组的值 array_splice($arr, $from, $end - $from + 1, $tempArr); } }
$tmp[] = $arr[$i]; $i++; } while ($j <= $high) { $tmp[] = $arr[$j]; $j++; } $len = count($tmp); for ($k = 0; $k < $len; $k++) { $arr[$low + $k] = $tmp[$k]; } } $arr = array(2, 3, 4, 6, 5, 9, 8, 7, 1, 0); echo "排序之前:"; print_r($arr); echo "</br>"; mergeSort($arr); echo "排序之后:"; print_r($arr); ?> </body> </html> /*归并排序 Order Results 排序前:Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 6 [4] => 5 [5] => 9 [6] => 8 [7] => 7 [8] => 1 [9] => 0 ) 排序后:Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] =>9 )*/