一.算法思想
- 归并排序可以说是自己觉得最难的一个排序算法了。倒也不是因为它的原理难,经过学习之后你会发现手动模拟归并算法还是很简单的,就是用代码实现时递归的那部分不太好理解,以后需要经常复习巩固一下了。
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为二路归并。
归并排序核心步骤:
按照其算法思想:
首先应在数组中找出有序的序列,但数组是否有序编译器可不知道。
所以可以将数组划分,一分二,二分四…直到每个序列中只有一个数字。
一个数字总可以认为他是有序的吧。
最后将同时划分的序列合并。
二.代码实现
package Sort;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] a = {49, 38, 65, 97, 76, 13, 27, 49};
System.out.println("原始数组为" + Arrays.toString(a));
mergeSort(a,0,a.length-1);
System.out.println("最终排序的结果为" + Arrays.toString(a));
}
public static 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 static void merge(int[] a, int left, int mid, int right) {
int i = left; //i指向左边的第一个元素
int j = mid + 1; //j指向右边的第一个元素
int[] temp = new int[a.length]; //临时数组
int t = 0; //t指向临时数组的第一个元素
while (i <= mid && j <= right) {
if (a[i] <= a[j]) {
temp[t] = a[i];
t++;
i++;
} else {
temp[t] = a[j];
t++;
j++;
}
}
while (i <= mid) { //右侧小数组已排序完毕,左侧小数组还有剩余,将左侧小数组元素依次放入大数组尾部
temp[t] = a[i];
t++;
i++;
}
while (j <= right) { //左侧小数组已排序完毕,右侧小数组还有剩余,将右侧小数组元素依次放入大数组尾部
temp[t] = a[j];
t++;
j++;
}
//将temp数组拷贝到a,但不是把所有的元素都拷贝进去
t=0;
int t1=left;
while (t1<=right){
a[t1]=temp[t];
t++;
t1++;
}
}
}