算法思想:
将两个有序的数组归并成一个更大的有序数组。
代码实现:
package com.example;
/**
*
* @Description : 归并算法对数组排序
* @ClassName : MergeSort
* @author : RelaxOne
* @date : 2018年8月18日 下午4:49:41
*/
public class MergeSort {
private static Double[] aux;
public static void sort(Double[] arr, int start, int end){
if(end <= start) {
return;
}
int mid = start + (end - start) / 2;
sort(arr, start, mid);
sort(arr, mid+1, end);
merge(arr,start,mid,end);
}
public static void merge(Double[] arr, int start, int mid, int end){
for(int k=start;k<end;k++) {
aux[k] = arr[k];
}
int i = start, j = mid + 1;
for(int k=start;k<end;k++) {
if(j < mid) {
arr[k] = aux[j++];
}else if(j > end) {
arr[k] = aux[i++];
}else if(aux[j] < aux[i]) {
arr[k] = aux[j++];
}else {
arr[k] = aux[i++];
}
}
}
/**
*
* @Description: 按升序方式排列数组
* @author : RelaxOne
* @date : 2018年8月18日
* @param arr
* @return
*/
public static Double[] sort_up(Double[] arr) {
int len = arr.length;
Double[] result = new Double[len];
int block, start;
for(block = 1; block<len;block*=2) {
for(start = 0; start<len; start += 2*block) {
int low = start;
int mid =(start + block)<len?(start+block):len;
int high = (start+2*block)<len?(start+2*block):len;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while(start1 < end1 && start2 < end2) {
result[low++] = arr[start1] <arr[start2]?arr[start1++]:arr[start2++];
}
while(start1 < end1) {
result[low++] = arr[start1++];
}
while(start2 < end2) {
result[low++] = arr[start2++];
}
}
Double[] temp = arr;
arr = result;
result = temp;
}
return arr;
}
/**
*
* @Description: 按降序方式排列数组
* @author : RelaxOne
* @date : 2018年8月18日
* @param arr
* @return
*/
public static Double[] sort_down(Double[] arr) {
int len = arr.length;
Double[] result = new Double[len];
for(int block = 1; block<len;block*=2) {
for(int start = 0; start<len; start += 2*block) {
int low = start;
int mid =(start + block)<len?(start+block):len;
int high = (start+2*block)<len?(start+2*block):len;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while(start1 < end1 && start2 < end2) {
result[low++] = arr[start1] >arr[start2]?arr[start1++]:arr[start2++];
}
while(start1 < end1) {
result[low++] = arr[start1++];
}
while(start2 < end2) {
result[low++] = arr[start2++];
}
}
Double[] temp = arr;
arr = result;
result = temp;
}
return arr;
}
}
测试代码:
package com.example;
public class Test {
public static void main(String[] args) {
Double[] arr = new Double[] {1.2,-4.2,2.5,3.8,1.9};
arr = MergeSort.sort_down(arr);
printArray(arr);
}
public static void printArray(Double[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
}
测试结果: