我正在嘗試使用stl庫進行合併排序算法,但遇到一些問題。下面是我使用用指向數組的指針進行合併排序
template <typename Item, typename SizeType>
void merge_sort(Item array[], SizeType size){
size_t n1; //Size of the first subarray
size_t n2; //Size of the second subarray
if(size > 1){
//Compute the size of the subarrays
n1 = size/2;
n2 = size - n1;
//create the temp array.
int* n1Temp = new int[n1];
int* n2Temp = new int[n2];
int i;
for(i = 0; i < n1; i++)
n1Temp[i] = array[i];
for(i = 0; i < n2; i++)
n2Temp[i] = array[i + n1];
//recursive calls
merge_sort(n1Temp, n1);//sort from array[0] through array[n1 - 1]
merge_sort(n2Temp, n2);//sort from array[n1] to the end
//Merge the two sorted halves.
vector<int> v(array, array + size);
merge(n1Temp, n1Temp + n1, n2Temp, n2Temp + n2, v.begin());
copy(v.begin(), v.end(), array);//copy the vector back to the array
delete[] n1Temp;
delete[] n2Temp;
}
}
代碼排序不錯,但問題是,它就像一個澳碼(N^2)算法,而不是爲O(n \ log n)的,這是由於創作在每個合併排序調用中的矢量(我認爲)。我試圖消除載體,只是用在合併功能的陣列可以在下面
//Merge the two sorted halves.
int* finalArray = new int[n1 + n2];
merge(n1Temp, n1Temp + n1, n2Temp, n2Temp + n2, begin(finalArray));
array = finalArray;
可以看出但這讓我不過是錯誤的。有什麼我能做的,以挽救我的合併排序算法?
爲什麼不直接將'n1temp'和'n2temp'合併回'array'? –
'merge(n1Temp,n1Temp + n1,n2Temp,n2Temp + n2,array);'應該工作 - 你會得到什麼錯誤? – user93353
這確實有用!你們兩個都對。我得到的錯誤是因爲我試圖在指針數組中使用迭代器。 – eBehbahani