分治法的归并排序(Java)

来源:互联网 发布:java三大框架教学视频 编辑:程序博客网 时间:2024/04/26 19:10
/*分治法——归并排序 * 二路归并排序的分治策略是:(1)划分:将待排序序列r1, r2, …, rn划分为两个长度相等的子序列r1, …, rn/2和rn/2+1, …, rn;(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列;(3)合并:将这两个有序子序列合并成一个有序序列。 */public class MergeSort {/** * @param args */public static void main(String[] args) {int a[] = { 21, 34, 56, 43, 99, 37, 78, 10 };// 这里对8个元素进行排序int low = 0, high = 7;// 初始化low和high的值,即数组的起始和终止的坐标// 辅助数组b,作为临时数组int b[] = new int[a.length];//输出排序前的数组System.out.print("排序前:");for (int i = 0; i <= high; i++) {System.out.print(a[i] + " ");}// 归并排序mergerSort(a, low, high, b);//输出排序后的数组System.out.print("排序后:");for (int i = 0; i <= high; i++) {System.out.print(a[i] + " ");}}/** * 分治和归并 *  * @param a * @param low * @param high * @param b */public static void mergerSort(int a[], int low, int high, int b[]) {int mid = 0;if (low < high) {mid = (high + low) / 2;// 分治位置,即将数组拆分的位置mergerSort(a, low, mid, b);mergerSort(a, mid + 1, high, b);merger(a, low, mid, high, b);// 归并}}/** * 合并两个有序子序列 *  * @param a * @param low * @param mid * @param high * @param b *            辅助数组 */public static void merger(int[] a, int low, int mid, int high, int b[]) {int i = low;int j = mid + 1;int p = 0;// 合并两个有序数组 子序列1 a[low..mid] 子序列2 a[mid+1..high]while (i <= mid && j <= high) {b[p++] = (a[i] <= a[j]) ? a[i++] : a[j++];}// 如果子序列1没有合并完则直接复制到复制数组中去while (i <= mid) {b[p++] = a[i++];}// 如果子序列2没有合并完则直接复制到复制数组中去while (j <= high) {b[p++] = a[j++];}// 把辅助数组的元素复制到原来的数组中去for (p = 0, i = low; i <= high; i++, p++) {a[i] = b[p];}}}
程序2
public class Mergesort {public static void merge(int[]a,int low,int mid,int high){int[]b=new int[high-low+1];int s=low;int t=mid+1;int k=0;while(s<=mid&&t<=high){if(a[s]<=a[t])b[k++]=a[s++];elseb[k++]=a[t++];}while(s<=mid)b[k++]=a[s++];while(t<=high)    b[k++]=a[t++];for(int i=0;i<b.length;i++){a[low+i]=b[i];}}public static void mergesort(int a[],int low,int high){if(low<high){mergesort(a,low,(low+high)/2);mergesort(a,(low+high)/2+1,high);merge(a,low,(high+low)/2,high);}}public static void main(String[]args){int[]a={1,15,24,26,58,45,14,15,14,74};mergesort(a,0,a.length-1);for(int i=0;i<a.length;i++){System.out.print(a[i]+" ");}}}


	
				
		
原创粉丝点击