归并排序,顾名思义,就是将数据进行合并,我们首先将待排数组分成两个子序列,然后在对其单个序列进行排序,不断递归到只有两个元素的子序列,然后再向上返回,最中得到的是两个有序的子序列,最后我们通过一个辅助数组,遍历这两个数组,挑选出较小的元素将其放在辅助数组中,这样我们就会在辅助数组中将数排好序了,然后我们再将辅助数组中的数据复制到原数组中即可。
代码实例:
public void sort (int []a,int left,int right) {
if(left<right){
//将传入的数组找出其中间位置,然后对两部分进行递归
int center = (left+right)/2;
sort (a,left,center);
sort (a,center+1,right);
merge(a,left,center,right);
}
}
//定义了一个辅助数组,首先将传入的起始位置记录下来然后对两部分进行比较,将较小的存在一个数组中,依次存取,哪一部分取的值比较小,哪一个部分数组就开始向前进位,
//最后将剩余的数复制放在辅助数组中,最后将我们当前数组排序后的依次插入到原数组中。
public void merge(int []a,int left,int center,int right){
int b [] = new int [a.length];
int mid = center+1;
int third = left;
int tmp = left;
while (left<= center && mid <= right){
if(a[left]<= a[mid]){
b[third++] = a[left++];
}
else {
a[third++] = a[mid++];
}
}
while (mid <= right){
b[third++] = a[mid++];
}
while (left<=center){
b[third++] = a[left++];
}
while (tmp <= right){
a[tmp] = b[tmp++];
}
}