Exemple #1
0
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)));
}
Exemple #6
0
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++];
        }
    }
}
Exemple #7
0
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;
}
Exemple #9
0
/**
 * 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;
}
Exemple #10
0
/**
 * 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);
}
Exemple #11
0
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);
    }
}
Exemple #12
0
        $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 )*/