本篇內(nèi)容介紹了“Java歸并排序怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元河北做網(wǎng)站,已為上家服務(wù),為河北各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。NlogN 由于需要兩兩比較 因此也是穩(wěn)定的!
首先考慮下如何將將二個有序數(shù)列合并。這個非常簡單,只要從比較二個數(shù)列的第一個數(shù),誰小就先取誰,取了后就在對應(yīng)數(shù)列中刪除這個數(shù)。然后再進(jìn)行比較,如果有數(shù)列為空,那直接將另一個數(shù)列的數(shù)據(jù)依次取出即可。
//將有序數(shù)組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++];
}可以看出合并有序數(shù)列的效率是比較高的,可以達(dá)到O(n)。
解決了上面的合并有序數(shù)列問題,再來看歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進(jìn)行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了?
可以將A,B組各自再分成二組。依次類推,當(dāng)分出來的小組只有一個數(shù)據(jù)時,可以認(rèn)為這個小組組內(nèi)已經(jīng)達(dá)到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。
歸并排序的效率是比較高的,設(shè)數(shù)列長為N,將數(shù)列分開成小數(shù)列一共要logN步,每步都是一個合并有序數(shù)列的過程,時間復(fù)雜度可以記為O(N),故一共為O(N*logN)。因為歸并排序每次都是在相鄰的數(shù)據(jù)中進(jìn)行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。
#include <iostream>
#include <cassert>
//將二個有序數(shù)列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); //再將二個有序數(shù)列合并
}
}
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;
}用遞歸無非就是將一個大數(shù)組一半一半的分 然后再逆序 組合起來! 我們可以直接從最底層的一個一個的組合來組正一個大數(shù)組
#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歸并排序怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
分享文章:Java歸并排序怎么實現(xiàn)
轉(zhuǎn)載注明:http://chinadenli.net/article28/phdccp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、標(biāo)簽優(yōu)化、小程序開發(fā)、品牌網(wǎng)站建設(shè)、用戶體驗、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)