归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治 (divide-and-conquer )策略(分治法将问题分(divide)成一些 小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序的时间复杂度为线性对数阶,即nlongn。空间复杂度为n。
java代码:
import java.util.Arrays;
public class MergeSortTest {
public static void main(String[] args) {
int []arr = new int[]{8, 4, 5, 7, 1, 3, 6, 2};
Merge test = new Merge(arr);
test.divide(0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
}
class Merge{
int []arr;//待排序的数组
int []temp;//辅助数组,用于存储临时数据
public Merge(int[] arr) {
this.arr = arr;
temp = new int[arr.length + 1];
}
public void divide(int start, int end) {
if(start < end) {
int mid = (start + end) / 2;
divide(start, mid);//递归左半部分
divide(mid + 1, end);//递归右半部分
merge(start, mid, end);
}
}
public void merge(int start, int middle, int end) {
int i = start;//左边开始索引
int j = middle + 1;//右边开始索引
int index = 0;//辅助数组索引
while(i <= middle && j <= end) {//两边都没有排完时
if(arr[i] > arr[j]) {//右边数组值小
temp[index++] = arr[j];//填充到辅助数组中
j++;
}else {
temp[index++] = arr[i];
i++;
}
}
while(i <= middle) {//左边有剩余
temp[index++] = arr[i];
i++;
}
while(j <= end) {
temp[index++] = arr[j];
j++;
}
index = 0;
for(i = start; i <= end; i++) {//将辅助数组中排好序的值放入原始数组中
arr[i] = temp[index++];
}
}
}