歸併排序 遞迴的應用 面試的小難點

2021-07-23 07:45:06 字數 967 閱讀 3157

歸併排序(merge)是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。 將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。

歸併排序演算法穩定,陣列需要o(n)的額外空間,鍊錶需要o(log(n))的額外空間,時間複雜度為o(nlog(n)),演算法不是自適應的,不需要對資料的隨機讀取。

工作原理:

1、申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

2、設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

3、比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

4、重複步驟3直到某一指標達到序列尾

5、將另一串行剩下的所有元素直接複製到合併序列尾

public void sort(int array,int

left,int

right)

public void mergesort(intarray,int

left,int center,int

right)else

}while(left

<=center)

while(mid

<=right)

while(start<=right)

}

@test

public

void

testmergesort() ;

sort(a, 0, a.length-1);

system.out.println(arrays.tostring(a));

}

遞迴的歸併排序

利用遞迴的特性,先將當前序列的子串行並歸,再並歸當前序列 遞迴結束條件,當前序列的長度為1 並歸前乙個子串行 歸併後乙個子串行 對當前序列進行並歸 遞迴歸併排序演算法 void sort mergesort int arr,int len,int mode 遞迴並歸的執行函式 void sort m...

歸併排序的遞迴實現

歸併排序是一種很經典的演算法。原理就是 把乙個陣列按照五五開的方式分成小塊,然後再乙個乙個的歸併起來。在歸併的過程之中,也要保證兩個區間內的數字在歸併前的時候是有序的,並且在歸併完成之後也是有序的。這樣一直歸併下去,直到資料的區間是陣列頭到陣列尾。include include using name...

歸併排序的遞迴與非遞迴

歸併排序 二路歸併 處理大資料很有用 把整個陣列平均分成左右兩部分 分治演算法 先對左邊的區間進行歸併排序 右邊的區間進行歸併排序 直到size 0 size 1 3.合併兩個有序陣列 時間複雜度o n logn 空間複雜度o n 穩定性 穩定 void merge int array,int le...