归并排序算法的思路是将数组分为两半,对每部分递归地应用归并排序。在两部分都排好序后,对它们进行归并。
public class MergeSort {
public static void sort(int[] list) {
int len = list.length;
if(len > 1) {
int[] firstHalf = new int[len/2];
System.arraycopy(list, 0, firstHalf, 0, len/2);
sort(firstHalf);//对list数组前半部分递归调用
int[] lastHalf = new int[len-len/2];
System.arraycopy(list, len/2, lastHalf, 0, len - len/2);
sort(lastHalf);//对list数组后半部分递归调用
merge(firstHalf, lastHalf, list);//将排序后的list合并
}
}
public static void merge(int[] firstHalf, int[] lastHalf, int[] list) {
int currentFirst = 0; //firstHalf当前遍历位置的索引
int currentLast = 0; //firstHalf当前遍历位置的索引
int currentList = 0; //list当前遍历位置的索引
//每次取出firstHalf和lastHalf中未放入list中的最小数字,将较小的放入list
while(currentFirst < firstHalf.length && currentLast < lastHalf.length) {
if(firstHalf[currentFirst] < lastHalf[currentLast]) {
list[currentList++] = firstHalf[currentFirst++];
}else {
list[currentList++] = lastHalf[currentLast++];
}
}
//若lastHalf已全部放入list,将firstHalf剩余的依次放入list
while(currentFirst < firstHalf.length) {
list[currentList++] = firstHalf[currentFirst++];
}
//若firstHalf已全部放入list,将lastHalf剩余的依次放入list
while(currentLast < lastHalf.length) {
list[currentList++] = lastHalf[currentLast++];
}
}
public static void main(String[] args) {
int[] num = {2,4,6,5,3,7,8,1};
sort(num);
for(int i : num) {
System.out.print(i+" ");
}
}
}