排序之歸併排序

2021-08-03 03:56:14 字數 1151 閱讀 6134

歸併排序和快速排序的思想一樣,都是依據分治法(遞迴)。

兩者不同的是,歸併需要對子問題的解進行合併,即合併兩個已排序的表,合併的時間為線性的,最多進行了n-1次比較,其中n是元素的總數。

歸併排序的基本思路就是將陣列分成二組a和b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如何讓這二組組內資料有序了?

可以將a,b組各自再分成二組。依次類推,當分出來的小組只有乙個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞迴的分解數列,再合併數列就完成了歸併排序。

package sort;

/** * created by mook on 2017/6/28.

*/public

class

mergesort

while (i <= m)

temp[k++] = a[i++];

while (j <= n)

temp[k++] = a[j++];

for (i = 0; i < k; i++)

a[first + i] = temp[i];

}private

static

void

msort(int a, int first, int last, int temp)

}public

static

void

mergesort(int data)

int length = data.length;

int tmparray = new

int[data.length];

msort(data, 0, length - 1, tmparray);

tmparray = null;

}}

以上**實現保證了排序的穩定性

歸併排序的效率是比較高的,設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為o(n*logn)。因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的。

排序之歸併排序

歸併排序還是有點雲裡霧裡 尤其是遞迴的時候的狀態樹與函式呼叫時的棧的狀態不太清楚,需要寫 加斷點做測試 先記錄下來,後面有時間再弄,先查到乙個用斷點測試後,描述歸併排序時遞迴狀態樹的部落格 其實如果按照 極客大學 演算法訓練營的覃超老師講的分治的模板,應該比較好寫出來 分治的模板 int divid...

排序之歸併排序

歸併排序演算法思想 分而治之 divide conquer 每個遞迴過程涉及兩個步驟 第一,分解 把待排序的 n 個元素的序列分解成兩個子串行,每個子串行包括 n 2 個元素.第二,合併 合併兩個排好序的子串行,生成排序結果.第一步 public static void mergeinternal ...

排序之歸併排序

package mergesort import shellsort.shellsort import choosesort.example 歸併排序 歸併的含義 將兩個有序的陣列合併成乙個有序陣列 思想 通過遞迴的方法,將陣列不斷地分割,直到陣列裡只有乙個元素時返回。然後1 1歸併 2 2歸併 4...