zoukankan      html  css  js  c++  java
  • MergeSort 归并排序(java)

    MergeSort 归并排序
    排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素
    		  2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1
    		  3,子列元素个数为1,说明这个子列已经排好序,开始逐级合并子序列进行排序
    
    该算法需要合并分解的子序列,所以需要额外一个辅助过程Merge(A,p,q,r)来完成两个子列的合并,A为数组,p,q,r为数组下标,其中A[p,q]和A[q+1,r]为两个已经排好序的子序列,∞代表哨兵值。
    Merge伪代码:
    	Merge(A,p,q,r)
    	n1 = q - p + 1
    	n2 = r - q
    	let L[1..n1+1] and R[1..n2+1] be new arrays
    	for i = 1 to n1
    		L[i] = A[p+i-1]
    	for j = 1 to n2
    		R[j] = a[q+j]
    	L[n1+1] = ∞
    	R[n2+1] = ∞
    	i = 1
    	j = 1
    	for k = p to r
    		if L[i] <=R[j]
    			A[k] = L[i]
    			i = i + 1
    		else 
    			A[k] = R[j]
    			j = j + 1
    
    MergeSort(归并排序)伪代码:
    	MergeSort(A,p,r)
    	if p < r
    		q = (p+r)/2
    		MergeSort(A,p,q)
    		MergeSort(A,q+1,r)
    		Merge(A,p,q,r)
    public class MergeSort{
        public static void main(String[] args) {
            int A[] = {
                1,6,4,5,2,9,7,23,56,43,98,56
            };
            int[] temp = new int[A.length];
            MergeSort(A,temp,0,A.length-1);
            for (int i:A){
                System.out.print(i+" ");
            }
        }
    
        public static void MergeSort(int[] A,int[] temp,int start,int end){
            if (start<end){
                int mid = (start+end)/2;
                //把数组分解为两个子列
                MergeSort(A,temp,start,mid);
                MergeSort(A,temp,mid+1,end);
                //逐级合并两个子列
                Merge(A,temp,start,mid,end);
            }
        }
    
        public static void Merge(int[] A,int[] temp,int start,int mid,int end){
            int i = start;
            int j = mid+1;
            int k = 0;
            while(i<=mid&&j<=end){
                if (A[i]<=A[j]) {
                    temp[k] = A[i];
                    i++;
                    k++;
                }else {
                    temp[k] = A[j];
                    j++;
                    k++;
                }
            }
            while(i<=mid){
                temp[k] = A[i];
                k++;
                i++;
            }
            while(j <= end){
                temp[k] = A[j];
                k++;
                j++;
            }
            for (int m = 0; m<k; m++) {
                A[start+m] = temp[m];
            }
        }
    }

      

  • 相关阅读:
    数据结构-串的堆分配存储
    ServerSocket
    Java-坦克大战
    Java-输入输出流
    MyEclipse 快捷键
    数据结构-串的定长顺序存储
    我的软考资料集合
    软考中级软件设计师考试大纲
    2016年第一季度阅读书目
    中国大陆开源镜像网站汇总
  • 原文地址:https://www.cnblogs.com/yzdtofly/p/7249918.html
Copyright © 2011-2022 走看看