归并排序:归并排序是分治法的一种实现算法
分治法的基本思想:将一个难以直接解决的大问题分解为多个可容易解决的规模较小的子问题,且须保证这些规模较小的子问题是相互独立与原问题是相同性质的,子问题的解合并可得原问题的解。分治法分为两步:1,。递归的分; 2.合并
递归的基本思想:自己直接或间接的调用自身的方法
递归要素:递归出口和递归方程 在递归中要先写递归出口再写递归方程
算法描述:
1.分:在分的方法中定义先两个指针,一个 low 指针指向开头,一个 high 指向结尾;再定义一个指向中间位置的指针 mid ;要进行分的位置就是 mid 指针指向的位置,递归左边是从索引为 low 到 mid ;递归右边是从索引为 mid + 1 到 high 。
2.合并:定义两个指针和一个临时数组,分别指向两个要合并数组的开头,然后两个值一一比较,数值小的的元素往元素临时数组中插入,然后再插入数值大的,当把所有数据都放入到临时数组后,再将临时数组的元素一一对应放入到原数组中。
算法图解:
动态图:
代码实现:
public static void main(String[] args) {
int a[] = {6,5,3,1,8,7,2,4};
mergeSort(a, 0, a.length - 1);
System.out.println("排序结果:" + Arrays.toString(a));
}
/** * 分的方法
* @param a 传入待排序的数组
* * @param low 开头位置的索引
* * @param high 结尾位置的索引
* */
public static void mergeSort(int[] a, int low, int high) {
//递归出口
if(low >= high) {
return;
}
//定义中间位置
int mid = (low + high)/2;
//递归左边
mergeSort(a, low, mid);
//递归右边
mergeSort(a, mid+1, high);
//合并
merge(a,low,mid,high);
System.out.println(Arrays.toString(a));
}
/** * 合并的方法
* @param a 待排序的数组
* * @param low 开头位置的索引
* * @param mid 中间位置的索引
* * @param high 结尾位置的索引
* */
public static void merge(int[] a, int low, int mid, int high) {
//定义第一个数组的的开始位置的索引
int s1 = low;
//定义第二个数组的开始位置的索引
int s2 = mid+1;
//定义临时数组
int[] temp = new int[high-low+1];
//定义临时数组的下标
int i = 0;
//判断大小将数组放入到临时数组当中去
while(s1<=mid && s2<=high) {
if(a[s1] <= a[s2]) {
temp[i++] = a[s1++];
}else {
temp[i++] = a[s2++];
}
}
//判断s1当中是否还剩有数据,如果有将其全部拷贝到临时数组当中去
while (s1 <= mid) {
temp[i++] = a[s1++];
}
//判断s1当中是否还剩有数据,如果有将其全部拷贝到临时数组当中去
while (s2 <= high) {
temp[i++] = a[s2++];
}
//将临时数组当中的数据放回原数组
for (int j = 0; j < temp.length; j++) {
a[j+low] = temp[j];
}
}