您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Java歸并排序怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。NlogN 由于需要兩兩比較 因此也是穩(wěn)定的!
首先考慮下如何將將二個有序數(shù)列合并。這個非常簡單,只要從比較二個數(shù)列的第一個數(shù),誰小就先取誰,取了后就在對應(yīng)數(shù)列中刪除這個數(shù)。然后再進行比較,如果有數(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ù)列的效率是比較高的,可以達到O(n)。
解決了上面的合并有序數(shù)列問題,再來看歸并排序,其的基本思路就是將數(shù)組分成二組A,B,如果這二組組內(nèi)的數(shù)據(jù)都是有序的,那么就可以很方便的將這二組數(shù)據(jù)進行排序。如何讓這二組組內(nèi)數(shù)據(jù)有序了?
可以將A,B組各自再分成二組。依次類推,當(dāng)分出來的小組只有一個數(shù)據(jù)時,可以認(rèn)為這個小組組內(nèi)已經(jīng)達到了有序,然后再合并相鄰的二個小組就可以了。這樣通過先遞歸的分解數(shù)列,再合并數(shù)列就完成了歸并排序。
歸并排序的效率是比較高的,設(shè)數(shù)列長為N,將數(shù)列分開成小數(shù)列一共要logN步,每步都是一個合并有序數(shù)列的過程,時間復(fù)雜度可以記為O(N),故一共為O(N*logN)。因為歸并排序每次都是在相鄰的數(shù)據(jù)中進行操作,所以歸并排序在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)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。