JAVA常用排序算法之归并排序
具体的实现方式如下:
算法的平均时间复杂度为O(n×log(n))。
实现的代码如下:
import java.util.ArrayList;
import java.util.List;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {4324, 12, 456, 11, 0, 22, 46, 78,22};
print(mergeSort(arr));
}
//主方法
private static int[] mergeSort(int[]arr){
List<int[]> list = separate(arr);
recursion(list);
return list.get(0);
}
//递归进行聚合的方法
private static void recursion(List<int[]>list){
if (list.size()<=1){
return;
}
list.add(merge(list.remove(0),list.remove(1)));
recursion(list);
}
//对数组进行分组的方法
private static List<int[]> separate(int[] arr) {
//用一个list来存储数字数组
List list=new ArrayList<int[]>();
//分为偶数和奇数
if (arr.length%2==0){
for (int i=2;i<arr.length;i++){
list.add(new int[]{arr[i]});
}
}else {
list.add(new int[]{arr[0],arr[1]});
//对第一组数据进行排序
int[]first= (int[]) list.get(0);
if (compare(first[0],first[1])){
int temp=first[0];
first[0]=first[1];
first[1]=temp;
}
for (int i=2;i<arr.length;i++){
list.add(new int[]{arr[i]});
}
}
return list;
}
//聚合的方法
private static int[] merge(int[] arr, int[] arr_0) {
int[] merge = new int[arr.length + arr_0.length];
//将两组数据合并到数组中
for (int i = 0; i < arr.length; i++) {
merge[i] = arr[i];
}
int k = 0;
for (int j = arr.length; j < (arr.length + arr_0.length); j++) {
merge[j] = arr_0[k];
k++;
}
//两组排好的数据,直接插入排序
for (int v = arr.length - 1; v < arr.length + arr_0.length; v++) {
for (int f = 0; f < v; f++) {
//如果比所有的数字都小的话
if (merge[v]<merge[f]){
//将数据进行插入,其他的后推一步
int temp = merge[v];
for (int h = v; v >=f + 1; v--) {
merge[v] = merge[v - 1];
}
merge[f] = temp;
}
if (merge[f] <= merge[v] && merge[v] <= merge[f + 1]) {
//将数据进行插入,其他的后推一步
int temp = merge[v];
for (int h = v; v > f + 1; v--) {
merge[v] = merge[v - 1];
}
merge[f + 1] = temp;
}
}
}
return merge;
}
//比较的方法
private static boolean compare(int a, int b) {
return a > b ? true : false;
}
//打印的函数
private static void print(int[] arr) {
for (int i : arr
) {
System.out.println(i);
}
}
}