zoukankan      html  css  js  c++  java
  • 分治法解决合并排序(c++和Java源代码)

    Java源代码

    public class Mergesort1 {
    
        public static void merge(int[]a,int low,int mid,int high){//对两组已经排序的数组进行合并
            int[]b=new int[high-low+1]; //临时数组,存储个数为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++];
                else                   //否则后半部数据暂存,并下标自加
                    b[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++){     //将暂存的数据重新填充至array[low]--array[high]中
                a[low+i]=b[i];
            }
        }
        public static void mergesort(int a[],int low,int high){//对数组进行递归排序
            int mid;
            if(low<high){
                mid=(low+high)/2;
                mergesort(a,low,mid);
                mergesort(a,mid+1,high);
                merge(a,low,mid,high);
            }
        }
        public static void main(String[]args){
            int[]a={4,34,2,56,5,9,6,45,8,3};
            System.out.println("排序前数组为:");
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" "); }
            mergesort(a,0,a.length-1);
            System.out.println("
    排序后数组为:");
            for(int i=0;i<a.length;i++){
                System.out.print(a[i]+" ");}    
        }
    
    }

    运行结果:

    排序前数组为:
    4 34 2 56 5 9 6 45 8 3
    排序后数组为:
    2 3 4 5 6 8 9 34 45 56

    C++源代码:

    #include <iostream>
    
    using namespace std;
    
    void Merge(int *array, int low, int middle, int high)  //合并
    {
        int *A = new int[high - low + 1];  //临时数组,存储个数为high - low + 1个数据
        int i = low;
        int j = middle + 1;
        int k = 0;
        while(i <= middle && j <= high)  //直至前半部或后半部数据完全录入暂存
        {
            if(array[i] < array[j])  //如果前半部的数据小于后半部的,前半部数据暂存
                A[k++] = array[i++];
            else                     //否则后半部数据暂存,并下标自加
                A[k++] = array[j++];
        }
    
        while(i <= middle) //保证前半部数据录入暂存
            A[k++] = array[i++];
        while(j <= high)   //保证后半部数据录入暂存
            A[k++] = array[j++];
        for(i = low; i <= high; i++)  //将暂存的数据重新填充至array[low]--array[high]中
            array[i] = A[i - low];
    }
    
    void MergeSort(int *array, int low, int high)
    {
        int middle;  //二分
        if(low < high)
        {
            middle = (low + high) / 2;  //二分
            MergeSort(array, low, middle); //前半部
            MergeSort(array, middle + 1, high);  //后半部
            Merge(array, low, middle, high);  //合并
        }
    }
    
    int main()
    {
        cout<<"输入需要排列数据的个数:";
    
        int n;
        cin>>n;  //录入需要排列的个数
        int *array = new int[n];
        cout<<endl<<"请输入数据:"<<endl;
    
        for(int i = 0; i < n; i++)
        {
            cin>>array[i];  //录入未排序的数据
        }
    
        MergeSort(array, 0, n - 1);  //进行排序
    
        cout<<"排列后数据:"<<endl;
        for(int j = 0; j < n; j++)  //输出排列结果
        {
            cout<<array[j]<<" ";
        }
          cout<<endl;
        return 0;
    }

    运行结果:

  • 相关阅读:
    SSH框架整合-myeclipse
    查看mysql数据库文件存放位置
    Java反射及注解学习- 反射的使用
    线程join方法demo-模拟叫号看病
    线程同步案例
    线程死锁示例
    《广西壮族自治区食品药品监督管理局》代码
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    词性标注 HMM
    kd树
  • 原文地址:https://www.cnblogs.com/fengxiaolan/p/6008659.html
Copyright © 2011-2022 走看看