递归
public class FactorialTest {
public static void main(String[] args) {
long result = factorial(5);
System.out.println(result);
}
public static long factorial(int n){
if(n==1){
return 1;
}
return n*factorial(n-1);
}
}
归并排序
原理
- 排序原理:
- 尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。
- 将相邻的两个子组进行合并成一个有序的大组;
- 不断的重复步骤2,直到最终只有一个组为止。
![在这里插入图片描述](https://img-blog.csdnimg.cn/daf2fb08205540cc98419eb9a05eabd4.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f7d63734b05041f08b430db7632035a5.png#pic_center)
API设计
![在这里插入图片描述](https://img-blog.csdnimg.cn/bb3a92c7ec7940c5971699bae5c53013.png)
代码
package paixu;
public class Merge {
private static Comparable[] assist;
public static void sort(Comparable[] a){
assist = new Comparable[a.length];
int lo = 0;
int hi = a.length-1;
sort(a,lo,hi);
}
private static void sort(Comparable[] a,int lo,int hi){
if(hi <= lo){
return;
}
int mid = lo+(hi-lo)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
private static void merge(Comparable[] a,int lo,int mid,int hi){
int i = lo;
int p1 = lo;
int p2 = mid+1;
while (p1<=mid && p2<=hi){
if(less(a[p1],a[p2])){
assist[i++] = a[p1++];
}else{
assist[i++] = a[p2++];
}
}
while (p1<=mid){
assist[i++] = a[p1++];
}
while (p2<=hi){
assist[i++] = a[p2++];
}
for (int j = lo; j <= hi; j++) {
a[j] = assist[j];
}
}
private static Boolean less(Comparable a,Comparable b){
return a.compareTo(b) < 0;
}
private static void exch(Comparable[] o,int a,int b){
Comparable temp;
temp = o[a];
o[a] = o[b];
o[b] = temp;
}
}
public static void main(String[] args) {
Integer[] o = {10,9,8,7,6,5,4,3,2,1,90};
Merge.sort(o);
System.out.println(Arrays.toString(o));
}
效率对比
- 以10000-1完全倒序为例子进行希尔排序和归并排序进行比较
- 归并排序
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf4f89aae952407aae656a18911e29f5.png)
- 希尔排序
![在这里插入图片描述](https://img-blog.csdnimg.cn/bce8d8c6d6714d0d8c3ab84b06fd84e2.png)
- 希尔排序和归并排序效率其实差不多,只是使用场合不同,归并排序是典型的空间换时间的排序方式