归并排序是利用递归与分治技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再利用递归方法将排好序的半子表合并成为越来越大的有序序列。
归并排序中,“归“代表的是递归的意思,即递归的将数组折半的分离为单个数组。“并”就是将分开的数据按照从小到大的或者从大到小的顺序放在一个数组里。
算法原理:
- 对于给定的一组记录(假设n个),首先将每两个相邻的长度为1 的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,再将其两两归并,反复执行此过程,直到得到一个有序序列。
代码:
public class MergeSorted {
public static void Merge(int[] arr, int start, int mid, int end){
int i , j , k;
int n1 = mid - start + 1;
int n2 = end - mid;
int[] larr = new int[n1];
int[] rarr = new int[n2];
for (i = start, j = 0; j < n1; i++, j++) {
larr[j] = arr[i];
}
for (i = mid + 1, j = 0; j < n2; i++, j++) {
rarr[j] = arr[i];
}
for (k = start, i = 0, j = 0; i< n1 && j < n2; k++) {
if(larr[i] < rarr[j]){
arr[k] = larr[i];
i++;
}
else{
arr[k] = rarr[j];
j++;
}
}
if(i < n1){
for (j = i; j < n1; j++, k++) {
arr[k] = larr[j];
}
}
if(j < n2){
for (i = j; i < n2; i++, k++) {
arr[k] = rarr[i];
}
}
}
public static void sorted(int[] arr, int start, int end){
if(start < end){
int mid = (start + end)/2;
sorted(arr, start, mid);
sorted(arr, mid + 1, end);
Merge(arr, start, mid, end);
}
}
public static void main(String[] args) {
int[] a = {3,2,4,5,1,6,7};
sorted(a, 0, a.length - 1);
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + " ");
}
}
}