大家好我是苏麟 , 今天说说归并排序 .
正式学习归并排序之前,我们得先学习一下递归算法。
定义:
定义方法时,在方法内部调用方法本身,称之为递归.
public void show(){
System.out.println("aaaa");
show();
}
作用:
它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的 程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
注意事项:
在递归中,不能无限制的调用自己,必须要有边界条件,能够让递归结束,因为每一次递归调用都会在栈内存开辟 新的空间,重新执行方法,如果递归的层级太深,很容易造成栈内存溢出。
需求:
请定义一个方法,使用递归完成求N的阶乘
分析:
1!: 1
2!: 2*1=2*1!
3!: 3*2*1=3*2!
4!: 4*3*2*1=4*3!
...
n!: n*(n-1)*(n-2)...*2*1=n*(n-1)!
所以,假设有一个方法factorial(n)用来求n的阶乘,那么n的阶乘还可以表示为n*factorial(n-1)
代码实现:
public class Test {
public static void main(String[] args) throws Exception {
int result = factorial(5);
System.out.println(result);
}
public static int factorial(int n){
if (n==1){
return 1;
}
return n*factorial(n-1);
}
}
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子 序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序 表,称为二路归并。
需求:
排序前:{8,4,5,7,1,3,6,2} 排序后:{1,2,3,4,5,6,7,8}
排序原理:
1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是 1为止。
2.将相邻的两个子组进行合并成一个有序的大组;
3.不断的重复步骤2,直到最终只有一个组为止。
代码 :
package src.sl.sort;
/**
* 归并排序
* 数据类型 : int
*/
public class MergeSort {
//辅助数组
public static int[] assist;
public static void main(String[] args) {
int[] arr = new int[]{2,5,6,1,3,2,4,8,6,7,5};
sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
/**
* 对数组全部排序
*
* @param arr
*/
public static void sort(int[] arr) {
assist = new int[arr.length];
int left = 0;
int right = arr.length-1;
sort(arr, left, right);
}
/**
* 对数组部分排序
*
* @param arr
* @param left
* @param right
*/
public static void sort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int mid = left + (right-left) / 2;
sort(arr, left, mid);
sort(arr,mid + 1,right);
//归并
merge(arr, left, mid, right);
}
/**
* 归并
*
* @param arr
* @param left
* @param mid
* @param right
*/
public static void merge(int[] arr, int left, int mid, int right) {
int i = left;
int p1 = left;
int p2 = mid + 1;
while (p1 <= mid && p2 <= right){
if (arr[p1] < arr[p2]){
assist[i++] = arr[p1++];
}else {
assist[i++] = arr[p2++];
}
}
while (p1 <= mid){
assist[i++] = arr[p1++];
}
while (p2 <= right){
assist[i++] = arr[p2++];
}
for (int j = left; j<=right;j++){
arr[j] = assist[j];
}
}
}
这期就到这里 , 下期见!