排序就是将一组对象按照某种顺重新排列的过程,但是在处理较大的数字时,普通的排序已经没法满足时间的要求,于是发现了一种简单的递归排序的算法:归并排序
1.归并排序的定义
所谓的归并排序,就是将一个要排序的数组递归的分成两半分别排序,排好序后,然后在将两部分数组归并起来。
优点:
其性质使它能够保证任意长度为N的数组排序所需时间和NlogN成正比;
缺点:
它所需的格外空间和N成正比
2.归并排序算法的过程及思想
例如数组:nums={2,9,5,4}
如图将nums的四个元素进行递归拆分:
继续拆分:
拆到单个元素时候,已经无法进行拆分了,此时,就开始合并,并在合并的过程中排序:
继续合并:
此时归并排序已经结束。
整体的思想就是递归调用持续将数组划分为子数组,直到每个子数组只包含一个元素。然后,改算法将这些笑的子数组归并为稍大的有序子数组,直到形成一个有序的数组。
因此,对于多元素数组也有更好的理解:
3.归并排序算法的实现:
public class MergeSort { //归并排序
public static void mergeSort(int[] list){
if (list.length>1){
//归并排序前部分的数组
int firstHalf[] = new int[list.length/2];
System.arraycopy(list, 0,firstHalf,0,list.length/2);
mergeSort(firstHalf);
//归并排序后部分的数组
int secondHalfLength = list.length - list.length/2;
int [] secondHalf = new int[secondHalfLength];
System.arraycopy(list,list.length/2,secondHalf,0,secondHalfLength);
mergeSort(secondHalf);
merge(firstHalf,secondHalf,list);
}
}
public static void merge(int[] firstHalf, int[] secondHalf, int[] list) {
int current1 =0;
int current2 =0;
int current3 =0;
while (current1 <firstHalf.length && current2 < secondHalf.length){
if (firstHalf[current1] <= secondHalf[current2]){
list[current3++] = firstHalf[current1++];
}else {
list[current3++] = secondHalf[current2++];
}
}
while (current1 <firstHalf.length){
list[current3++] = firstHalf[current1++];
}
while (current2 < secondHalf.length){
list[current3++] = secondHalf[current2++];
}
}
}
注意:
- 在比较
firstHalf[current1] < secondHalf[current2]
将< 换成<=
号。即:firstHalf[current1] <= secondHalf[current2]
这样,在其左右相等时候会将左边的元素先加入新数组。这样做的好处是有利于解决一些算法问题:
例如:
逆序对