我目前正在做一個合并排序演算法,但當我運行代碼時,我得到一個錯誤,說 "在拋出一個'std::out_of_range'的實體后終止呼叫。這是我的代碼。
template<typename T>。
void merge(std:: vector<T> &vec, int l, int m, int r){
int i = l;
int j = m 1;
int k = l;
//CREATE TEMPORARY MEMORY[/span]。
int temp[vec.size()] 。
while(vec.at(i) <= m && j <= r){
if(vec.at(i) <= vec.at(j) ){
temp[k] = vec.at(i)。
i ;
k ;
}else{
temp[k] = vec.at(j)。
j ;
k ;
}
}
while (i <= m){ /first half: 復制前半部分的剩余元素,如果有的話。
temp[k] = vec.at(i)。
i ;
k ;
}
while (j <= r){ /second half: 復制第二部分的剩余元素,如果有的話。
temp[k] = vec.at(j)。
j ;
k ;
}
for(size_t p = 1; p <= r; p ){ //copy temp array to original array
vec.at(p) = temp[k]。
}
合并排序函式
template<typename T>
void mergeSort(std::vector<T> &vec, int l, int r)>{
if(l < r){
int m = (l r) / 2; //find midpoint[/span]。
mergeSort(vec, l, m); //first half[/span]。
mergeSort(vec, m 1, r); //second half[/span
merge(vec, l, m, r); //merge。
}
}
uj5u.com熱心網友回復:
你的merge函式中有幾個問題(你可以通過除錯輕松發現):
vec.at(i) <= m將一個value和一個index進行比較。這兩者是不相關的。所以要改變:
while(vec.at(i) <= m && j <= r){
與:
while(i <= m & & j <= r){
最后的回圈從p = 1開始,這是一個索引,在很多情況下,它不在被合并的范圍內。所以要改變:
for(size_t p = 1; p <= r; p ){
與:
for(size_t p = l; p <= r; p ){
同一個回圈的主體使用k作為索引,但該變數與回圈無關,并且其值超出了正在考慮的范圍。所以要改變:
vec.at(p)= temp[k]。
用:
vec.at(p) = temp[p]。
通過這些修改,你的代碼就可以作業了。
然而,令人遺憾的是,temp總是擁有完整的向量的大小,而你只使用它的一個小節。請考慮減少記憶體的使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/326074.html
標籤:
