五 歸併排序

2022-07-02 01:42:09 字數 3328 閱讀 8099

歸併排序,首先需要用到遞迴,遞迴這個東西說難不難,說簡單也挺煩的。

遞迴從**直觀的表現來看,就是自己呼叫自己。比如這樣:

public

int recursive(int

a)

這樣就是乙個遞迴,但是問題是這樣會無線遞迴下去。所以必須給他乙個出口:

public

static

void

main(string args)

public

static

int recursive(int

a)

這個遞迴就是個從1加到10的結果,重點不在遞迴,遞迴就到這裡。

什麼是歸併排序?首先我們假定這個陣列可以分成兩半,而且在這兩個半個陣列中是排好順序的,然後將這兩個陣列合併。

package

test;

/***

* *

@author

zy 劉會發

* @version

1.0 *

@since

2020/4/14 */

public

class

mergesort ;

sort(a);

print(a);

}public

static

void sort(int

arr)

public

static

void merge(int

arr) else

k++;//

新陣列下標加一

}

//可能在上邊的合併完後原陣列中還有為合併的數值

while (i < mid) temp[k++] = arr[i++];//

將左半個陣列中數值複製到新陣列中

while (j < arr.length) temp[k++] = arr[j++];//

將右半個陣列中數值複製到新陣列中

for (int m = 0; m < temp.length; m++)

}public

static

void print(int arr)

}}

上訴**是假定兩個半個陣列中都已經排好順序了,但是實際情況並不會是這種情況的,所以這樣的**一定是不可以的,還需要修改!

package

test;

/***

* *

@author

zy 劉會發

* @version

1.0 *

@since

2020/4/14 */

public

class

mergesort ;

sort(a);

print(a);

}public

static

void sort(int

arr)

/*** 因為合併可能會重任意乙個位置開始,任意乙個位置結束,所以需要指定幾個引數*

* @param

arr 要排序的陣列

* @param

leftpro 左指標 包含

* @param

rightpro 右指標 包含

* @param

rightbound 右邊界 不包含

*/public

static

void merge(int arr, int leftpro, int rightpro, int

rightbound) else

k++;//

新陣列下標加一

}

//可能在上邊的合併完後原陣列中還有為合併的數值

while (i <= mid) temp[k++] = arr[i++];//

將左半個陣列中數值複製到新陣列中

while (j < rightbound) temp[k++] = arr[j++];//

將右半個陣列中數值複製到新陣列中

for (int m = 0; m < temp.length; m++)

}public

static

void print(int arr)

}}

那麼這樣修改就靈活一些了,可以再陣列任何位置進行合併了,既然是歸併排序,那麼接下來就是遞迴了。

package

test;

/***

* *

@author

zy 劉會發

* @version

1.0 *

@since

2020/4/14 */

public

class

mergesort ;

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

print(a);

}/*** 對sort方法進行遞迴**

@param

arr 要排序的陣列

* @param

left 左邊開始的位置

* @param

right 右邊結束的位置

*/public

static

void sort(int arr, int left, int

right)

/*** 因為合併可能會重任意乙個位置開始,任意乙個位置結束,所以需要指定幾個引數*

* @param

arr 要排序的陣列

* @param

leftpro 左指標 包含

* @param

rightpro 右指標 包含

* @param

rightbound 右邊界 不包含

*/public

static

void merge(int arr, int leftpro, int rightpro, int

rightbound)

else

}//可能在上邊的合併完後原陣列中還有為合併的數值

while (i <= mid) temp[k++] = arr[i++];//

將左半個陣列中數值複製到新陣列中

while (j <= rightbound) temp[k++] = arr[j++];//

將右半個陣列中數值複製到新陣列中

for (int m = 0; m < temp.length; m++)

}public

static

void print(int arr)

}}

排序五 歸併排序

寫作功底有限,不明白的推薦看一下麻省理工學院的演算法導 開課。歸併演算法是指將兩個有序序列合併為乙個有序序列的方法。例如,現有兩個有序序列a 1,3,5 b 2,4,6 將其合併為乙個序列c。分別對a,b建乙個游標索引,初始值為0。第一步比較a,b索引的值a 1,3,5 b 2,4,6 1 2,所以...

排序 五 之歸併排序

歸併排序是乙個相當 穩定 的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?首先來看歸併排序要解決的第乙個問題 兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1 3,5,7,8 陣列2為 1,4,9,1...

演算法五之歸併排序

public class merge 呼叫遞迴先對陣列進行分組 static void sort int arr,int low,int hi int mid low hi low 2 sort arr,low,mid sort arr,mid 1,hi merge arr,low,hi,mid s...