前言:前面搞定了插入、冒泡、选择···这些磨人的小妖精,这一次的目标是搞定归并排序~归并排序这个东东呢,算法考试中有遇到过,当时并不能完整无误的写出来,学渣属性曝光~~
原理:归并排序是分治法-分而治之最经典的表达。
最基本的思想就是将两个有序的序列合并为一个有序序列。
把一个长度为N的数组,看成N个待合并的序列
第一步做两两合并,得到N/2个有序的序列
接下来两两合并上一步得到的有序序列,得到N/4个有序序列
继续合并···
经过log N 次的归并后,就得到了我们所需要的有序序列~
代码如下:
package zj.com.merge;
import java.util.Arrays;
public class MergeSort {
public 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 void merge(int[] a,int left,int mid,int right){
/*temp作为临时数组顺序存储元素
* newindex 作为临时数组的下标指引
* copyindex 是将该段排序后的元素复制回原数组的指引
* sepindex 是A、B两个数组后一个数组的第一个元素索引*/
int[] temp = new int[a.length];
int newindex = left;
int copyindex = left;
int sepindex = mid+1;
while(left<=mid&&sepindex<=right)
{
if(a[left]<=a[sepindex])
{
//将较小的一个数放入临时数组中
temp[newindex] = a[left];
newindex++;
left++;
}
else
{
temp[newindex] = a[sepindex];
newindex++;
sepindex++;
}
}
//若A、B数组有一个已经全部放入临时数组,则剩下的不用比较直接放入
while(left<=mid)
{
temp[newindex++] = a[left++];
}
while(sepindex<=right)
{
temp[newindex++] = a[sepindex++];
}
//将临时数组中的元素按顺序复制到原数组
while(copyindex<=right)
{
a[copyindex] = temp[copyindex++];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MergeSort m = new MergeSort();
int[] a = {3,2,1,6,5,4,9,8,7,10,12};
m.mergeSort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
}