即 两路合并排序 T=O(nlogn)
代码:
1 | public class MergeSortTest { |
// 归并排序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//缺省参数:则默认排序所有元素
public static void MergeSort(int[] l){
MergeSort(l, 0, l.length-1);
}
//重载:排序部分范围内的元素
public static void MergeSort(int[] l, int left, int right){
if(left<right){ //若序列长度超过1,则将其分割成两个子序列
int mid = (left+right)/2; //将待排序的序列一分为二
MergeSort(l, left, mid); //对左子序列排序
MergeSort(l, mid+1, right); //对右子序列排序
//将两个有序子序列合并成一个有序序列
Merge(l, left, mid, right);
/*
* 其实,只有最后当left==right,即一直向下递归分割,直到子序列长度为1时,
* 才会开始向上递归返回,执行该代码行,调用Merge合并函数。
*/
}
}
// 测试1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public static void main(String[] args) {
int[] l = new int[20];
//循环添加100内的随机数字到集合中
for(int i=0; i<20; i++){
Random random = new Random();
int value = random.nextInt(100);
l[i] = value;
}
System.out.println("排序前:");
for(int i=0; i<20; i++)
System.out.print(l[i]+"\0");
//归并排序
MergeSort(l);
System.out.println("\n排序后:");
for(int i=0; i<20; i++)
System.out.print(l[i]+"\0");
}
}