歸併排序,首先需要用到遞迴,遞迴這個東西說難不難,說簡單也挺煩的。
遞迴從**直觀的表現來看,就是自己呼叫自己。比如這樣:
publicint recursive(int
a)
這樣就是乙個遞迴,但是問題是這樣會無線遞迴下去。所以必須給他乙個出口:
publicstatic
void
main(string args)
public
static
int recursive(int
a)
這個遞迴就是個從1加到10的結果,重點不在遞迴,遞迴就到這裡。
什麼是歸併排序?首先我們假定這個陣列可以分成兩半,而且在這兩個半個陣列中是排好順序的,然後將這兩個陣列合併。
packagetest;
/***
* *
@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)
}}
上訴**是假定兩個半個陣列中都已經排好順序了,但是實際情況並不會是這種情況的,所以這樣的**一定是不可以的,還需要修改!
packagetest;
/***
* *
@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)
}}
那麼這樣修改就靈活一些了,可以再陣列任何位置進行合併了,既然是歸併排序,那麼接下來就是遞迴了。
packagetest;
/***
* *
@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...