分治法解決合並排序(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("\n排序后數組為:");
        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;
}

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM