Java实现初级排序算法之——归并排序算法

算法思想:

将两个有序的数组归并成一个更大的有序数组。

代码实现:

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] + " ");
		}
	}
	
}

测试结果:

猜你喜欢

转载自blog.csdn.net/liu548zhou/article/details/81810552