1.3.2歸并排序的其他實現(xiàn)

我看了下那篇merge sort,已經(jīng)很長了姜凄,所以專門新開一節(jié)來闡述其他實現(xiàn)政溃,包括python實現(xiàn)和c++使用vector(不使用指針和數(shù)組)。
先說python的态秧。
其實我想寫這篇文章就是看到了py的實現(xiàn)董虱,感覺很優(yōu)雅,當然申鱼,沒有上次的quick sort優(yōu)雅愤诱,你不得不承認python的語法糖確實好用,尤其是針對list润讥,dict和set的转锈,我真心覺得python將大部分(除了那些scikit-learn,tensorflow之類的底層輪子)算法工程師從繁瑣的實現(xiàn)中解放了出來楚殿,我一個師兄在百度某nlp部門撮慨,天天看n年前的老舊c++代碼竿痰,幾近崩潰(當然人家肯定要從底層寫起,不可能用tf砌溺,pytouch之類的)影涉。
廢話這么多,我們就寫一下吧:

def merge_sort(a):
  if len(a) <= 1:
    return a
  mid = len(a) / 2
  L = a[:mid]
  R = a[mid:]
  mergesort[L]
  mergesort[R]
  return merge(L, R)

def merge(L, R):
  tmp = [ ]
  i, j = 0, 0
  while (i<len(L) and j<len(R)):
    if L[i]<R[j]:
      tmp.append(L[i])
      i += 1
    else:
      tmp.append(R[j])
      j += 1
  tmp += L[i:]
  tmp += R[j:]
  return tmp

調(diào)用的main就這么寫一下:

if __name__ == '__main__':
    a = [2, 3, 6, 1, 9, 5, 0]
    print merge_sort(a)

其實python的簡潔是不用說的规伐,關鍵一點好的是蟹倾,在這個算法中,merge_sort中由于list索引的良好性質(zhì)猖闪,mid很巧妙地將原list劃分為兩個都是左閉右開的區(qū)間[)鲜棠,這樣的算法就很均衡,自己在紙上寫的時候就很容易判斷正誤培慌。
其實我就是看到了這個豁陆,才想用c++的vector實現(xiàn)一下,我覺得吧吵护,以后stl以及里邊封裝的數(shù)據(jù)結構會是主流盒音,可以說stl+引用將大大減少指針的上場空間。當然馅而,如果以后面試的時候你這樣寫祥诽,我估計問的問題就會從語法細節(jié)變?yōu)椤盀槭裁词莢ector?”瓮恭,“你說stl是主流雄坪,那你講講c++11和17”。信我偎血,問這些大而空的問題要絕對好于糾纏于語法細節(jié)诸衔;而面試的時候,指針的書寫極其容易寫出bug颇玷,大大減分笨农。
那么我們寫一下:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
void Merge(vector<int>&a, int left, int mid, int right)
{
    vector<int> l, r, tmp;
    for (int x = left; x < mid; ++x)
        l.push_back(a[x]);
    for (int x = mid; x < right; ++x)
        r.push_back(a[x]);
    int x = 0; int y = 0;
    while (x < (mid - left)&&y < (right - mid))
        if (l[x] <= r[y])
            tmp.push_back(l[x++]);
        else
            tmp.push_back(r[y++]);
    while (x<mid-left)
        tmp.push_back(l[x++]);
    while (y<right-mid)
        tmp.push_back(r[y++]);
    copy(tmp.begin(), tmp.end(), a.begin() + left);
}

void mergeSort(vector<int> &a, int left, int right)
{
    if (right - left <= 1)
        return;
    int mid = (left + right) / 2;
    mergeSort(a, left, mid);
    mergeSort(a, mid, right);
    Merge(a, left, mid, right);
}

還有一個地方可以修改一下,就是Merge中的tmp的使用帖渠≮艘啵可以直接對a進行操作(引用嘛),不過還需要一點點轉換空郊,我比較懶份招,就不寫了。這樣寫狞甚,避免了我一直很討厭的類似right - mid + 1這些+1-1的瑣事锁摔,統(tǒng)一為左閉右開,十分犀利(#害羞)哼审。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谐腰,一起剝皮案震驚了整個濱河市孕豹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌十气,老刑警劉巖励背,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砸西,居然都是意外死亡叶眉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門芹枷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅疙,“玉大人,你說我怎么就攤上這事杖狼⊥哑矗” “怎么了逝嚎?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵悯辙,是天一觀的道長催植。 經(jīng)常有香客問我榨呆,道長坷剧,這世上最難降的妖魔是什么爬凑? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任办绝,我火速辦了婚禮次舌,結果婚禮上熄攘,老公的妹妹穿的比我還像新娘。我一直安慰自己彼念,他們只是感情好挪圾,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逐沙,像睡著了一般哲思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吩案,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天棚赔,我揣著相機與錄音,去河邊找鬼徘郭。 笑死靠益,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的残揉。 我是一名探鬼主播胧后,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抱环!你這毒婦竟也來了壳快?” 一聲冷哼從身側響起途样,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎濒憋,沒想到半個月后何暇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凛驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年裆站,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔夭。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡宏胯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出本姥,到底是詐尸還是另有隱情肩袍,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布婚惫,位于F島的核電站氛赐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏先舷。R本人自食惡果不足惜艰管,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒋川。 院中可真熱鬧牲芋,春花似錦、人聲如沸捺球。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮兵。三九已至裂逐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胆剧,已是汗流浹背絮姆。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秩霍,地道東北人篙悯。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像铃绒,于是被迫代替她去往敵國和親鸽照。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容