1. 程式人生 > >歸併排序演算法(php)

歸併排序演算法(php)

概述: 歸併排序的演算法思想:講兩個或兩個以上的元素有序序列合併為一個有序序列。其中,二路歸併排序是最常見的歸併排序。

/**
 * 歸併排序演算法
 */
function mergeSort(&$arr) {
    $len = count($arr);//求得陣列長度

    mSort($arr, 0, $len-1);
}
/**
* 實際實現歸併排序的程式
* @param &$arr array 需要排序的陣列
* @param $left int 子序列的左下標值
* @param $right int 子序列的右下標值
*/
function mSort(&$arr, $left, $right) {

    if($left < $right) {
        //說明子序列記憶體在多餘1個的元素,那麼需要拆分,分別排序,合併
        //計算拆分的位置,長度/2 去整
        $center = floor(($left+$right) / 2);
        //遞迴呼叫對左邊進行再次排序:
        mSort($arr, $left, $center);
        //遞迴呼叫對右邊進行再次排序
        mSort($arr, $center+1, $right);
        //合併排序結果
        mergeArray($arr, $left, $center, $right);
    }
}

/**
* 將兩個有序數組合併成一個有序陣列
* @param &$arr, 待排序的所有元素
* @param $left, 排序子陣列A的開始下標
* @param $center, 排序子陣列A與排序子陣列B的中間下標,也就是陣列A的結束下標
* @param $right, 排序子陣列B的結束下標(開始為$center+1)
*/

function mergeArray(&$arr, $left, $center, $right){
    $a_i = $left;
    $b_i = $center+1;
    while($a_i<=$center && $b_i<=$right) {
        //當陣列A和陣列B都沒有越界時
        if($arr[$a_i] < $arr[$b_i]) {
            $temp[] = $arr[$a_i++];
        } else {
            $temp[] = $arr[$b_i++];
        }
    }
    //判斷 陣列A內的元素是否都用完了,沒有的話將其全部插入到C陣列內:
    while($a_i <= $center) {
        $temp[] = $arr[$a_i++];
    }
    //判斷 陣列B內的元素是否都用完了,沒有的話將其全部插入到C陣列內:
    while($b_i <= $right) {
        $temp[] = $arr[$b_i++];
    }
    //將$arrC內排序好的部分,寫入到$arr內:
    for($i=0, $len=count($temp); $i<$len; $i++) {
        $arr[$left+$i] = $temp[$i];
    }
}



相關推薦

歸併排序演算法php

概述: 歸併排序的演算法思想:講兩個或兩個以上的元素有序序列合併為一個有序序列。其中,二路歸併排序是最常見的歸併排序。 /** * 歸併排序演算法 */ function mergeSort(&a

3種插入排序演算法php

1.直接插入排序(插入排序) function InsertSort($arr, $n) {     for ($i = 1; $i < $n; $i ++) {         $t = $

排序演算法迭代歸併排序的理解與實現

基本概念 歸併排序大量引用了遞迴,儘管在程式碼上比較清晰,容易理解,但這會造成時間和空間上的效能損耗 排序追求的就是效率,可以講遞迴轉化成迭代,改動後效能上就得到了進一步的提高。非遞迴的迭代方法避免了遞迴時深度為log2(n)的棧空間,空間知識用到申請歸併臨時用到的TR陣

java排序演算法------歸併排序

歸併排序: 是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。 合

歸併排序演算法C語言

歸併排序: 思想:利用將兩個的有序資料序列合併成一個新的有序資料序列,在如何分成兩個有序資料的問題下,採用分治演算法。 時間複雜度:O(n*logn) 空間複雜度:O(n) 是否穩定: 穩

排序演算法歸併排序

1、二路歸併排序“歸併”即“合併”,是指將兩個或者兩個以上有序表組合成一個有序表。假如待排序表含有 n 個記錄,即可以視為 n 個有序的子表。每個子表長度為1,然後兩兩歸併,得到 n/2 個長度為 2 或者 1 的有序表,然後,再兩兩歸併,。。。。如此重複,直到合併成一個長度

圖解歸併排序演算法java版

歸併排序:採用分治法的思想(遞迴),將整個陣列序列分成兩個序列,再講兩個序列分成各自的子序列,採用遞迴的思想解決一個個的子問題。 歸併排序的時間複雜度:O(n*lgn) 歸病排序的空間複雜度:O(n) 歸併排序的兩個核心: 核心一:將兩個有序序列合併。比

排序演算法——歸併排序

歸併排序(Merge Sort)演算法就是將多個有序資料表合併成一個有序資料表。如果參與合併的只有兩個有序表,則稱為二路合併。對於一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合併排序。 合併排序演算法的運作如下: (1)首先將含有n個結點的待排序資料序列看成9個長度為1的有序子表

常見查詢和排序演算法PHP實現

下面分享一些最常見的演算法,用PHP如何實現。 1、氣泡排序 function bubble_sort($arr) { $n=count($arr); for($i=0;$i<

35. 排序演算法8歸併排序的迭代實現

1. 基本原理   在上篇文章中介紹了歸併排序的遞迴實現,雖然遞迴的實現方式很簡單,通過遞迴呼叫就可以實現,但是會佔用大量的時間和空間,使得演算法的效率下降;使用迭代的方式代替遞迴的方式雖然會使得程式碼的編寫變得困難,但是會增大效率。   遞迴的思想實際上是

排序演算法——歸併排序與遞迴

基本思想 分析歸併排序之前,我們先來了解一下分治演算法。 分治演算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。 分治演算法的一般步驟: (1)分解,將要解決的問題劃分成若干規模較小

Java-經典排序演算法

前言: 排序演算法有很多種,如選擇排序、插入排序、氣泡排序、桶排序、快速排序等等。這裡介紹的是簡化版桶排序、氣泡排序和插入排序。 推薦一本演算法入門書——《啊哈!演算法》 1. 桶排序[簡化版]: 原理:新建一個book陣列用來標記原陣列每一個數字出現的個數。

6分鐘演示,15種排序演算法視訊

    github:https://github.com/bingmann/sound-of-sorting 排序之聲 - “Audibilization”和排序演算法的視覺化:http://panthema.net/2013/sound-of-sorting/ 視訊:https

經典排序演算法1——氣泡排序演算法詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

經典排序演算法4——折半插入排序演算法詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

八大排序演算法——優先佇列、堆和堆排序

6.1 API 優先佇列是一種抽象資料型別,它表示了一組值和對這些值的操作。優先佇列最重要的操作就是刪除最大元素和插入元素。 6.2 初級實現 6.2.1 陣列實現(無序) 或許實現優先佇列最簡單方法就是基於下壓棧的程式碼。insert()方法的程式碼和棧的完全一樣。要實現刪除最大元素,

八大排序演算法——快速排序

快速排序可能是應用最廣泛的排序演算法。快速排序流行的原因是因為它實現簡單、適用於各種不同的輸入資料且在一般應用中比其他排序演算法都要快的多。快速排序的特點包括它是原地排序(只需要一個很小的輔助棧),且將長度為n的陣列排序所需的時間和nlogn成正比。快速排序的內迴圈比大多數排序演算法都要短小,這

排序演算法3--直接插入排序InsertSort

介紹: 插入排序的工作原理是,對於每個未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。 越有序越快 步驟: 1.從第一個元素開始,該元素可以認為已經被排序 2.取出下一個元素,在已經排序的元素序列中從後向前掃描 3.如果被掃描的元素(已排序)大於新元

排序演算法5--快速排序QuickSort

快速排序 時間複雜度: 平均O(nlogn) 最差的情況就是每一次取到的元素就是陣列中最小/最大的,這種情況其實就是氣泡排序了(每一次都排好一個元素的順序) 這種情況時間複雜度,就是氣泡排序的時間複雜度:T[n] = n * (n-1) = n^2 + n; 綜

排序演算法------氣泡排序

氣泡排序 氣泡排序: 兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序記錄為止 氣泡排序是將比較大的數字沉在最下面,較小的浮在上面 最簡單的氣泡排序 /* * 嚴格意義上說不滿足氣泡排序思想,應該是最簡單的交換排序而已 * 思路:讓每一個關鍵字