每日一題 92 歸併排序

2021-06-18 07:56:42 字數 1775 閱讀 6447

題目來自網路

題目(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 ...