归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
自上而下的递归;
自下而上的迭代;
算法步骤
- 先将每个元素都分开
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置(即left和mid+1);
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
- 重复步骤 3 直到某一指针达到序列尾;
- 将另一序列剩下的所有元素直接复制到合并序列尾。
代码实现
public class Merge_Sort {
public static void merge_sort(int[] array){
if (array==null||array.length<=0){
return;
}
merge(array,0,array.length-1);
}
//将元素拆开
public static void merge(int[] array,int left,int right){
if (left==right){
return;
}
int mid = (left+right)/2;
merge(array, left, mid);
merge(array,mid+1,right);
sort(array,left,right,mid);
}
public static void sort(int[] array,int left,int right,int mid){
int[] temp = new int[array.length];
int i = left;
int j = mid+1;
int t = 0;
while (i<=mid && j<=right){
if (array[i]<=array[j]){
temp[t++] = array[i++];
}else {
temp[t++] = array[j++];
}
}
while (i<=mid){
temp[t++] = array[i++];
}
while (j<=right){
temp[t++] = array[j++];
}
t=0;
while (left<=right){
array[left++] = temp[t++];
}
}
public static void main(String[] args) {
int[] array = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
merge_sort(array);
System.out.println(Arrays.toString(array));
}
}