題目來自網路
題目(1):基於陣列的歸併排序
題目(2):基於鍊錶的歸併排序
----------
題目(1):基於陣列的歸併排序
思路:借助分治的思想,總是先對待排序進行分割,之後再對兩個子串行進行合併,生成乙個有序序列。
時間複雜度為o(nlogn),空間複雜度為o(n)
**:
注意:下面**的void merge(int narr,int nstart,int nmid,int nend)
else
}while (ncurleft <= nleftend)
while(ncurright <= nrightend)
for (int i = 0;i < ncur;i++)//易忘點
delete narrmerge;
}void mergesort(int narr,int nstart,int nend)
int nmid = (nstart + nend) >> 1;
mergesort(narr,nstart,nmid);
mergesort(narr,nmid + 1,nend);
merge(narr,nstart,nmid,nend);
}void mergesort(int narr,int nlen)
輔助空間是每次歸併都申請一次,當然也可以只申請一次。這裡**就不表了。
題目(2):基於鍊錶的歸併排序
**
#include using namespace std;
struct listnode
; listnode* merge(listnode* pfirst,listnode* psec)
else
psec = psec->m_pnext;
} else
else
pfirst = pfirst->m_pnext;
} }if (pfirst == null && psec != null)
else
return pnewhead;
}listnode* mergesort(listnode* phead)
if (phead->m_pnext->m_pnext == null)//只有倆元素
return phead;
} //此時,鍊錶肯定有三個以上的元素
//分成兩個子問題
listnode* pfast = phead;
listnode* pslow = phead;
while(pfast->m_pnext && pfast->m_pnext->m_pnext)
psechead = pslow->m_pnext;
pslow->m_pnext = null;
pfirsthead = mergesort(phead);
psechead = mergesort(psechead);
//子問題合併
return merge(pfirsthead,psechead);
}void print(listnode* phead)
cout<>pnewnode->m_ndata;
pnewnode->m_pnext = null;
if (*phead == null)
else
} } int main()
每日一題 歸併排序
第一次寫部落格,大佬們輕點噴 注 作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。這是一道比較簡單的資料結構的題目,先來看題 本題要求實現二路歸併排序中的歸併操作,待排序列的長度...
每日一題 歸併排序
作為乙個計算機專業的本科生,每日做題也都是必不可少的,這個系列裡會更新一些我平時做的一些題目,大都比較簡單,不少題目在其他部落格裡也可以找到,我撰寫這些部落格僅用於記錄。這是一道比較簡單的資料結構的題目,先來看題 本題要求實現二路歸併排序中的歸併操作,待排序列的長度1 n 1000。void mer...
2020 1 20每日一題「歸併排序」
歸併排序顧名思義有乙個化歸合併的過程,那要合併在這之前就有分離,這就是歸併排序的步驟 先將要排序的一串數字劈開,劈到最小有序數列 也就是乙個乙個的時候,只有乙個那肯定有序啊 第二步再將他們逐漸合併,繼而變成乙個有序數列。演算法複雜度 最好情況 o nlogn 最壞情況 o nlogn 平均情況 o ...