一步一步搞清排序之歸併排序(JAVA)
阿新 • • 發佈:2019-02-20
前言:前面搞定了插入、冒泡、選擇···這些磨人的小妖精,這一次的目標是搞定歸併排序~歸併排序這個東東呢,演算法考試中有遇到過,當時並不能完整無誤的寫出來,學渣屬性曝光~~
原理:歸併排序是分治法-分而治之最經典的表達。
最基本的思想就是將兩個有序的序列合併為一個有序序列。
把一個長度為N的陣列,看成N個待合併的序列
第一步做兩兩合併,得到N/2個有序的序列
接下來兩兩合併上一步得到的有序序列,得到N/4個有序序列
繼續合併···
經過log N 次的歸併後,就得到了我們所需要的有序序列~
程式碼如下:
package zj.com.merge;
import java.util.Arrays;
public class MergeSort {
public void mergeSort(int[] a,int left,int right){
if(left<right)
{
int mid = (left+right)/2;
mergeSort(a, left, mid);
mergeSort(a, mid+1, right);
merge(a, left, mid, right);
}
}
public void merge (int[] a,int left,int mid,int right){
/*temp作為臨時陣列順序儲存元素
* newindex 作為臨時陣列的下標指引
* copyindex 是將該段排序後的元素複製回原陣列的指引
* sepindex 是A、B兩個陣列後一個數組的第一個元素索引*/
int[] temp = new int[a.length];
int newindex = left;
int copyindex = left;
int sepindex = mid+1 ;
while(left<=mid&&sepindex<=right)
{
if(a[left]<=a[sepindex])
{
//將較小的一個數放入臨時陣列中
temp[newindex] = a[left];
newindex++;
left++;
}
else
{
temp[newindex] = a[sepindex];
newindex++;
sepindex++;
}
}
//若A、B陣列有一個已經全部放入臨時陣列,則剩下的不用比較直接放入
while(left<=mid)
{
temp[newindex++] = a[left++];
}
while(sepindex<=right)
{
temp[newindex++] = a[sepindex++];
}
//將臨時陣列中的元素按順序複製到原陣列
while(copyindex<=right)
{
a[copyindex] = temp[copyindex++];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MergeSort m = new MergeSort();
int[] a = {3,2,1,6,5,4,9,8,7,10,12};
m.mergeSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}