91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java歸并排序怎么實現

發布時間:2021-12-08 13:53:30 來源:億速云 閱讀:142 作者:iii 欄目:大數據

本篇內容介紹了“Java歸并排序怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。NlogN 由于需要兩兩比較 因此也是穩定的!

首先考慮下如何將將二個有序數列合并。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了后就在對應數列中刪除這個數。然后再進行比較,如果有數列為空,那直接將另一個數列的數據依次取出即可。

//將有序數組a[]和b[]合并到c[]中  
void MemeryArray(int a[], int n, int b[], int m, int c[])  
{  
    int i, j, k;  
    i = j = k = 0;  
    while (i < n && j < m)  
    {  
        if (a[i] < b[j])  
            c[k++] = a[i++];  
        else  
            c[k++] = b[j++];   
    }  
    while (i < n)  
        c[k++] = a[i++];  
  
    while (j < m)  
        c[k++] = b[j++];  
}

可以看出合并有序數列的效率是比較高的,可以達到O(n)。

解決了上面的合并有序數列問題,再來看歸并排序,其的基本思路就是將數組分成二組A,B,如果這二組組內的數據都是有序的,那么就可以很方便的將這二組數據進行排序。如何讓這二組組內數據有序了?

可以將A,B組各自再分成二組。依次類推,當分出來的小組只有一個數據時,可以認為這個小組組內已經達到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數列,再合并數列就完成了歸并排序。

歸并排序的效率是比較高的,設數列長為N,將數列分開成小數列一共要logN步,每步都是一個合并有序數列的過程,時間復雜度可以記為O(N),故一共為O(N*logN)。因為歸并排序每次都是在相鄰的數據中進行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。

#include <iostream>
#include <cassert>
//將二個有序數列a[first...mid]和a[mid+1...last]合并。
void MerageArr(int a[], int first, int mid, int last, int temp[])
{
    int i = first, j = mid + 1;
    int k = 0;
    while (i <= mid && j <= last)
    {
        if (a[i] <= a[j])
        {
            temp[k++] = a[i++];
        }
        else
        {
            temp[k++] = a[j++];
        }
    }
    while (i <= mid)
    {
        temp[k++] = a[i++];
    }
    while (j <= last)
    {
        temp[k++] = a[j++];
    }
    for (i = 0; i < k; i++)
    {
        a[first + i] = temp[i];
    }

}
void MSort(int a[], int first, int last, int temp[])
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        MSort(a, first, mid, temp);    //左邊有序
        MSort(a, mid + 1, last, temp); //右邊有序
        MerageArr(a, first, mid, last, temp); //再將二個有序數列合并
    }
}
bool MergeSort(int a[], int n)
{
    int *temp = new int[n];
    assert(temp!=NULL);
    MSort(a, 0, n - 1, temp);
    delete [] temp;
    return true;
}
int main()
{
    int a[] = {5,4,3,2,1};
    MergeSort(a,5);
    for(int i=0;i<5;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}
用遞歸無非就是將一個大數組一半一半的分  然后再逆序 組合起來!   我們可以直接從最底層的一個一個的組合來組正一個大數組
#include<iostream>
using namespace std;
void merageArr(int a[],int first, int mid, int last,int tempArr[])
{
    int i=first;
    int j=mid+1;
    int k=0;
    while(i<=mid && j<=last)
    {
        if(a[i]<a[j])
        {
            tempArr[k++] = a[i++];
        }
        else
        {
            tempArr[k++] = a[j++];
        }
    }
    while(i<=mid)
    {
        tempArr[k++] = a[i++];
    }
    while(j<=last)
    {
        tempArr[k++] = a[j++];
    }
    for(int t=0;t<k;t++)
    {
        a[first+t] = tempArr[t];
    }
}
void MerageSort(int a[], int n)  //迭代
{
    int* tempArr = new int[n];
    for(int size=1; size<=n-1;size*=2)
    {
       int  low=0;
        while(low+size<=n-1)
        {
           int  mid=low+size-1;
           int  high=mid+size;
            if(high>n-1)
            {
                 high=n-1;
            }
            merageArr(a,low,mid,high,tempArr);
            low=high+1;
        }
    }
    delete []tempArr;
}
int main()
{
    int a[5]={5,4,3,2,1};
    MerageSort(a, 5);
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

“Java歸并排序怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永昌县| 三亚市| 通辽市| 河池市| 蕲春县| 宾阳县| 尚志市| 太谷县| 泸溪县| 龙井市| 新竹县| 中方县| 平山县| 宁波市| 华宁县| 个旧市| 博乐市| 朝阳区| 丰城市| 湘潭市| 株洲县| 江永县| 会昌县| 衡阳县| 建瓯市| 含山县| 虹口区| 山西省| 马公市| 美姑县| 庆云县| 南汇区| 班戈县| 句容市| 伊吾县| 南丰县| 精河县| 全椒县| 东莞市| 长岭县| 兴宁市|