我第一年是計算機科學專業的學生。我被賦予了遞回任務。我需要撰寫一個遞回函式來獲取兩個陣列,它們是它們的物理大小(非負),并對陣列進行排序并將它們以排序的方式放入第二個陣列中,而無需設定陣列以獲取幫助。想必第二個陣列的大小就足夠了。我無法撰寫對我有用的代碼,我很樂意你幫助我。
uj5u.com熱心網友回復:
所以你有兩個排序的陣列,我們假設第二個陣列有額外的空間分配來保存合并的陣列。
這是記憶體中的樣子:
array0, length 4
-------
|a|b|d|h|
0-1-2-3
array1, length 3
-------------
|b|c|e| | | | |
0-1-2-3-4-5-6
額外空間位于array1的存盤末尾。
在我們完成合并陣列后,索引 6 處的值是什么array1?由于索引 6 將是合并陣列中的最后一個元素,因此它將是任一輸入陣列的最大元素。由于輸入陣列已經排序,它將是 的最后一個元素array0或最后一個元素array1。讓我們比較它們并將較大的元素復制到索引 6。由于h大于e,我們復制h到索引 6。由于我們現在已經將 的最后一個元素array0放在其最終位置,我們可以假設array0現在長度為 3。
array0, length 3
-------
|a|b|d| |
0-1-2-3
array1, length 3
-------------
|b|c|e| | | |h|
0-1-2-3-4-5-6
現在我們對 的索引 5 再次執行相同的操作array1。我們比較(縮短的)array0和的最后一個元素array1。由于e大于d,我們復制e到索引 5 并將 的長度減少array11:
array0, length 3
-------
|a|b|d| |
0-1-2-3
array1, length 2
-------------
|b|c| | | |e|h|
0-1-2-3-4-5-6
重復直到輸入陣列被縮短到長度為 0,并且array1的存盤空間將被最終合并的陣列填充。
uj5u.com熱心網友回復:
這是先前建議的作業代碼。
如果您知道如何使其成為二進制檔案,我想在這里提供您的建議。
void combineArrays(int sortedArr1[], int size1,
int sortedArr2[], int size2)
{
int combinedSizes = size1 size2;
if (size1 == 0);
else if (sortedArr1[size1 - 1] > sortedArr2[size2 - 1])
{
sortedArr2[size2 size1-1] = sortedArr1[size1 - 1];
combineArrays(sortedArr1, size1 - 1, sortedArr2, size2);
}
else//sortedArr1[size1 - 1] < sortedArr2[size2 - 1]
{
sortedArr2[size2 size1 - 1] = sortedArr2[size2 - 1];
combineArrays(sortedArr1, size1, sortedArr2, size2 - 1);
}
}
uj5u.com熱心網友回復:
假設陣列不重疊,您可以從最高索引開始合并已排序的陣列:
void mergeArrays(const int * restrict a1, size_t n1,
int * restrict a2, size_t n2)
{
for (size_t k = n1 n2; n1 > 0;) {
if (n2 == 0 || a1[n1 - 1] > a2[n2 - 1]) {
a2[--k] = a1[--n1];
} else {
a2[--k] = a2[--n2];
}
}
}
這可以簡化為:
void mergeArrays(const int * restrict a1, size_t n1,
int * restrict a2, size_t n2)
{
for (size_t k = n1 n2; n1 > 0;)
a2[--k] = (n2 == 0 || a1[n1 - 1] > a2[n2 - 1]) ? a1[--n1] : a2[--n2];
}
如果需要使用遞回,請將回圈更改為遞回呼叫:
void mergeArrays(const int * restrict a1, size_t n1,
int * restrict a2, size_t n2)
{
if (n1 > 0) {
if (n2 == 0 || a1[n1 - 1] > a2[n2 - 1]) {
a2[n1 n2 - 1] = a1[n1 - 1];
mergeArrays(a1, n1 - 1, a2, n2);
} else {
a2[n1 n2 - 1] = a2[n2 - 1];
mergeArrays(a1, n1, a2, n2 - 1);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386514.html
