归并排序原理
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
网上找到的两张图片:
归并排序代码实现方式一:
public class _07MergeSortFinalExample {
public static void main(String []args){
int arr[] = {6,1,7,2,4,3,8,5};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int []arr){
int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
sort(arr,0,arr.length-1,temp);
}
private static void sort(int[] arr,int left,int right,int []temp){
if(left<right){
int mid = (left+right)/2;
sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
}
}
private static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;//左序列指针
int j = mid+1;//右序列指针
int t = 0;//临时数组指针
while (i<=mid && j<=right){
if(arr[i]<=arr[j]){
temp[t++] = arr[i++];
}else {
temp[t++] = arr[j++];
}
}
while(i<=mid){//将左边剩余元素填充进temp中
temp[t++] = arr[i++];
}
while(j<=right){//将右序列剩余元素填充进temp中
temp[t++] = arr[j++];
}
t = 0;
//将temp中的元素全部拷贝到原数组中
while(left <= right){
arr[left++] = temp[t++];
}
}
}
归并排序代码实现方式二:
import java.util.Arrays;
/**
* 归并排序: hadoop的底层:快速排序+归并排序
* 针对:针对多个有序的数据集进行排序
* 前提:需要排序的数据集必须是有序的
* 多路归并排序(>=2)
* 两路归并:每次合并数据集是 两个
*
* 归:
* 针对一个数据集进行排序
* 对这个数据集 拆分成多个有序的数据集
* 拆分到每个存储一个
*
* 并: 两个有序数组的排序
* 准备两个有序数组
* 创建一个新数组 长度=两个数组的长度和
* 遍历两个旧数组 比较后 放入旧数组中
*
*
*
*/
public class _07MergeSort {
public static void main(String[] args) {
//测试并步骤
int[] arr1 = {2,3,4,6,9};
int[] arr2 = {1,3,5,8,10};
int[] res = bingSort(arr1,arr2);
System.out.println(Arrays.toString(res));
}
public static int[] bingSort(int[] arr1,int[] arr2){
//新生成数组
int[] newarr = new int[arr1.length + arr2.length];
//定义三个下标 两个旧下标 一个新下标
int index_arr=0,index_arr1=0,index_arr2=0;
//有一个数组为空停止循环
while(index_arr1 < arr1.length && index_arr2 < arr2.length){
//进行判断,放入新数组中
//arr1中元素小于 arr2中元素
if(arr1[index_arr1] < arr2[index_arr2]){
newarr[index_arr++] = arr1[index_arr1++];
}else{
newarr[index_arr++] = arr2[index_arr2++];
}
}
//剩余 arr1剩余
for (int i = index_arr1; i < arr1.length; i++) {
newarr[index_arr++] = arr1[i];
}
//剩余 arr2剩余
while(index_arr2 < arr2.length){
newarr[index_arr++] = arr2[index_arr2++];
}
return newarr;
}
}
其他算法:
Java二分查找法
Java冒泡排序
Java选择排序
Java插入排序
Java希尔排序
Java计数排序
Java快排算法
Java归并排序
Java堆排序
动图演示