如果你正在尋找一個優雅的歸併再沒有什麼比:-)
這是一個遞歸函數更優雅:
這是一種分而治之的策略。我們基本上把數組分成更小的數組,排序更小的數組並將它們合併回來。
public static void mergesort(int a[],int left, int right){
/*
* Time : O(n log n)
* Space : O(n)
*/
int b[] = new int[right -left+1];
domergesort(a,left,right,b);
}
public static void domergesort(int a[],int left,int right, int b[]){
if(left < right){
int mid = (left+right)/2;
domergesort(a,left,mid,b);
domergesort(a,mid+1,right,b);
merge(a,left,mid,a,mid+1,right,b);
for(int k=left;k<=right;k++)
a[k] = b[k-left];
}
}
沒有多少IFS太..
來源:我的博客(http://cloudingitup.blogspot.com/p/reading-guide-arrays.html)
要它們合併起來作爲聯:
public static void merge(int a[], int al, int ar, int b[], int bl, int br, int c[]){
// al : a's left index ar : a's right index c: merged array
int i= al;
int j = bl;
int k=0;
int prev = c[0];
while (i<= ar && j <= br){
if (a[i] <= b[j])
if (prev != a[i]) // Too keep the union distinct
c[k++] = a[i++];
else
i++;
else
if (prev != b[j]) // Too keep the union distinct
c[k++] = b[j++];
else
j++;
prev = c[k-1];
}
while (i <= ar)
{
if (prev != a[i])
c[k++] = a[i++];
else
i++;
prev = c[k-1];
}
while (j <= br)
{
if (prev != b[j])
c[k++] = b[j++];
else
j++;
prev = c[k-1];
}
}
駕駛員代碼來說明的代碼:
int arr1[] = {1,1, 3, 4,4,4,5, 7};
int arr2[] = {2, 3, 5, 6,6,8};
int c[] = new int[8];
merge(arr1,0,7,arr2,0,5,c);
for(int i=0;i<8;i++)
System.out.print(c[i]);
輸出:12345678
什麼是實現語言? – DwB
你的假設是什麼?你是在考慮將數組作爲集合還是允許重複?必須對結果進行排序嗎? – PengOne
「if」語句本質上沒有任何不雅之處。 – PengOne