排序算法之归并排序
话不多说 直接上代码
代码如下(示例):
package com.MySort;
import com.MyFunctions.GetRodomArrays;
import java.util.Arrays;
public class MargeSort {
public static void main(String[] args) {
int arr[] = GetRodomArrays.acquireUniqueArr(15,10);
System.out.println(Arrays.toString(arr));
margeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void margeSort(int[] arr, int begin, int end) {
if(begin<end&&end>=0){
int midle = (begin+end)>>>1;
// midle本来就向下取整 本次递归有增量或者说是变量
margeSort(arr,begin,midle);
// middle 是变量!!!
margeSort(arr,midle+1,end);
marge(arr,begin,midle,end);
}
}
// 复制一份数组
private static void marge(int[] arr, int begin, int mid,int end) {
int[] helper = Arrays.copyOf(arr, arr.length);
// 原数组最终的指针
int current = begin;
// 左半边的指针
int left = begin;
// 右半边的指针
int right = mid + 1;
while (left <= mid && right <= end) {
if (helper[left] < helper[right]) {
arr[current] = helper[left];
left++;
current++;
} else {
arr[current] = helper[right];
right++;
current++;
}
}
// 上面这个while循环走完,至少有一边的指针已经打到头了
// 为了有另一边的辅助数组里面还有未处理的数据 进行最后检查
// 如果左边没有打空 那就不用比较了 直接将剩余元素填入arr中
while (left <= mid) {
arr[current] = helper[left];
current++;
left++;
}
// 如果右边没有打空,其实可以不用管,因为右边本来就是存放相对较大的元素 没有必要进行覆盖
// while (right <=end) {
// arr[current] = helper[right];
// current++;
// right++;
// }
}
}
2.读入数据
代码如下(示例):
总结
主要是一种冒泡+分治+递归的算法。本算法主要学习分治的思想。(文章主要记录学习思路)